English 中文(简体)
SpeakHere示例无法播放从互联网加载的声音。
原标题:
  • 时间:2008-11-16 14:42:22
  •  标签:

我想玩从互联网加载的声音文件,所以我试图从iPhone SDK SpeakHere示例开始。我录制了声音,然后保存并上传到互联网,我可以从声音工具中下载该文件并播放,没有任何问题。但当我尝试从SpeakHere播放该URL时,我会收到错误程序收到信号:“EXC_BAD_ACCESS”

在进行调试后,我发现在 -[AudioPlayer calculateSizesFor:] 中,它将 bufferByteSize 设为一个巨大的数字 806128768,导致缓冲分配失败。

那是因为在

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

返回的maxPacketSize为806128768。

我想知道如何使AudioFileGetProperty正常工作。

My sound file is here, you could right-click and download from here.

我正在使用这种方式来设置-[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,它具有自己的API调用集,如AudioFileStreamOpenAudioFileStreamParseBytes等。

我想出了一个解决办法。那就是将内容从互联网复制到本地文件,然后从该本地文件播放声音。看起来问题得到解决。

不完美,但能够工作。如果有真正的解决方案,请告诉我。

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

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




相关问题
热门标签