2008-11-16 51 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,​​等。