SpeakHere示例无法播放从互联网加载的声音

时间:2008-11-16 14:42:23

标签: iphone cocoa-touch audio core-audio

我想播放从互联网加载的声音文件,所以我尝试从iPhone SDK SpeakHere示例开始。我录制了声音,然后保存并上传到互联网,我可以下载该文件并播放没有问题的声音工具。但是当我尝试从SpeakHere播放该网址时,我收到错误Program received signal: “EXC_BAD_ACCESS”

在追踪之后,我发现在-[AudioPlayer calculateSizesFor:]中,它将bufferByteSize设置为一个巨大的数字806128768,这导致缓冲区分配失败。

那是因为在

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

返回的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"]];

非常欢迎任何建议。

3 个答案:

答案 0 :(得分:4)

是的,您需要使用Audio File Stream Services直接在互联网上播放。

我发现“AudioFileStreamExample”示例很有用,应该安装在

/Developer/Examples/CoreAudio/Services/AudioFileStreamExample/

另外,Matt Gallagher有一篇名为“Streaming and playing an MP3 stream”的文章,其中包含iPhone示例代码。我没仔细看过,但似乎对你有所帮助。

答案 1 :(得分:3)

我认为主要问题是您使用的代码处理 AudioFile 对象(磁盘上的本地音频文件),但是当您从网络加载音频时,您想要使用 AudioFileStream < / strong>,它有自己的一组API调用,例如AudioFileStreamOpenAudioFileStreamParseBytes等。

答案 2 :(得分:1)

我想出了一个解决方法。这是将内容从Internet复制到本地文件,然后从该本地文件播放声音。并且似乎解决了问题。

不完美,但只是有效。如果有人有真正的解决方案,请告诉我。

以下是从互联网复制到本地文件的代码。

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