SpeakHereサンプルは、インターネットから読み込まれるサウンドを再生できません

StackOverflow https://stackoverflow.com/questions/293929

質問

インターネットから読み込んだサウンドファイルを再生したいので、iPhone SDKのSpeakHereサンプルから起動しようとしました。サウンドを録音し、インターネットに保存してアップロードしました。そのファイルをダウンロードして、サウンドツールから問題なく再生できました。しかし、SpeakHereからそのURLを再生しようとすると、 Program received signal:“ EXC_BAD_ACCESS” というエラーが表示されます。

トレースした後、-[AudioPlayer CalculateSizesFor:] bufferByteSize を806128768という巨大な数値に設定しているため、バッファーの割り当てに失敗しました。

そしてその理由は

AudioFileGetProperty(audioFileID, kAudioFilePropertyPacketSizeUpperBound, &propertySize, &maxPacketSize);

返される maxPacketSize は806128768です。

AudioFileGetProperty を機能させる方法について疑問に思っています。

私のサウンドファイルはこちら、 右クリックしてこちらからダウンロードできます。

この方法を使用して、-[AudioViewController playOrStop] メソッドでURLを設定しています:

// AudioPlayer *thePlayer = [[AudioPlayer alloc] initWithURL: self.soundFileURL];
AudioPlayer *thePlayer = [[AudioPlayer alloc] initWithURL:
    [NSURL URLWithString: @"http://chineseresume.com/localbiz/uploads/myfilename_7_Recording.caf"]];

ご提案は大歓迎です。

役に立ちましたか?

解決

はい、オーディオを使用する必要がありますインターネットから直接再生するファイルストリームサービス

" AudioFileStreamExample"が見つかりました。有用な例、これはにインストールする必要があります

/Developer/Examples/CoreAudio/Services/AudioFileStreamExample/

また、Matt Gallagherには" MP3ストリームのストリーミングと再生" iPhoneのサンプルコードが含まれています。注意深く見ていませんが、役に立つかもしれません。

他のヒント

主な問題は、使用しているコードが AudioFile オブジェクト(ディスク上のローカルオーディオファイル)を処理しているが、ネットワークからオーディオをロードするときに AudioFileStream AudioFileStreamOpen AudioFileStreamParseBytes など、使用する独自のAPI呼び出しのセットがあります。

回避策を見つけました。つまり、インターネットからローカルファイルにコンテンツをコピーし、そのローカルファイルからサウンドを再生します。そして問題を解決するように見えます。

完璧ではありませんが、機能するだけです。誰かが本当の解決策を持っているなら、私に知らせてください。

インターネットからローカルファイルにコピーするコードを次に示します。

-(CFURLRef)saveURL:(NSString *)urlString {
    NSURL *url = (NSURL*)[[NSURL alloc] initWithString:urlString];
    NSData *data = [[NSData alloc] initWithContentsOfURL:url];
    NSArray *filePaths =    NSSearchPathForDirectoriesInDomains (                        NSDocumentDirectory,                                                        NSUserDomainMask,                                                   YES                                                    ); 

    NSString *recordingDirectory = [filePaths objectAtIndex: 0];

    CFStringRef fileString = (CFStringRef) [NSString stringWithFormat: @"%@/BufferFile.caf", recordingDirectory];
    NSLog(@"fileString = %@" , fileString);
    // create the file URL that identifies the file that the recording audio queue object records into
    CFURLRef fileURL =  CFURLCreateWithFileSystemPath (                                                NULL,   fileString,                                             kCFURLPOSIXPathStyle,                                             false);
    SInt32 err = 0;

    CFURLWriteDataAndPropertiesToResource (
  fileURL, (CFDataRef)data, nil, &err);
    return fileURL;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top