SpeakHereサンプルは、インターネットから読み込まれるサウンドを再生できません
-
08-07-2019 - |
質問
インターネットから読み込んだサウンドファイルを再生したいので、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;
}