2008-11-16 71 views
3

我想播放從互聯網加載的聲音文件,所以我嘗試從iPhone SDK SpeakHere示例開始。我錄製了聲音,然後保存並上傳到互聯網,我可以下載該文件並從聲音工具中無問題地播放。但是當我嘗試從SpeakHere播放該URL時,出現錯誤Program received signal: 「EXC_BAD_ACCESS」SpeakHere示例不能播放從互聯網加載的聲音

經過跟蹤後,我發現在-[AudioPlayer calculateSizesFor:],它將bufferByteSize設置爲一個巨大的數字806128768,這導致緩衝區分配失敗。

而且,由於在

​​

返回maxPacketSize是806128768.

我想知道如何使AudioFileGetProperty工作。

我的聲音文件是here, 您可以右鍵單擊並從here下載。

我使用這種方式設置在-[AudioViewController playOrStop]方法的網址:

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

任何建議是非常值得歡迎的。

回答

4

是的,你需要使用Audio File Stream Services直接從互聯網上玩。

我找到了「AudioFileStreamExample」的例子是有用的,它應安裝在

/Developer/Examples/CoreAudio/Services/AudioFileStreamExample/ 

此外,馬特·加拉格爾有一個名爲「Streaming and playing an MP3 stream」的文章,其中包括iPhone示例代碼。我沒有仔細看過它,但似乎它可能對您有所幫助。

1

我想出了一個解決方法。即將互聯網上的內容複製到本地文件,然後從該本地文件播放聲音。並出現解決問題。

不完美,但只是工作。如果有人有真正的解決方案,請讓我知道。

這裏是從互聯網複製到本地文件的代碼。

-(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; 
} 
3

我認爲主要的問題是,你正在使用涉及的AudioFile對象(在磁盤上的本地音頻文件),但是當你的代碼從您要使用AudioFileStream網絡,它具有加載音頻它自己的一組API調用使用諸如AudioFileStreamOpen,​​等。