启动一个AVAssetReader,停止对远程I / O AudioUnit的callback

我正在使用AVAssetReader从iPod库中读取audio。 ( 见这里 )我然后采取读缓冲区,并通过一个audio单元播放。 我正在尝试折叠代码,以便在播放audio时进行stream式传输。 但是,如果AVAssetReader正在运行,则AudioUnit将停止接收对其的kAudioUnitProperty_SetRenderCallback的调用。

我简化了我的代码,只在AudioUnitscallback中播放文件…

OSStatus UnitRenderCB(void* pRefCon, AudioUnitRenderActionFlags* flags, const AudioTimeStamp* timeStamp, UInt32 busNum, UInt32 numFrames, AudioBufferList* pData){ OSStatus tErr = noErr; MySoundStream* pS = (MySoundStream*)pRefCon; ExtAudioFileRead(pS->InRef, &numFrames, pData); // Here's the MP3/WAV/etc Data loaded... if (numFrames <= 0){ // EOF? ExtAudioFileSeek(pS->InRef, 0); return 1; } return tErr; } 

然后我调用这个代码,AudioUnit停止播放,UnitRenderCB不再被调用。

  NSError* error = nil; AVAssetReader* reader = [[AVAssetReader alloc] initWithAsset:songURL error:&error]; { AVAssetReaderTrackOutput* output = [[AVAssetReaderTrackOutput alloc] initWithTrack:songTrack outputSettings:outputSettingsDict]; [reader addOutput:output]; [output release]; } [reader startReading]; [reader cancelReading]; [reader release]; 

我正在使用与此处列出的相同的AudioUnit设置

AVAssetReader是否使用AudioUnit系统? 没有办法让他们一起工作吗?

您必须创build一个AudioSession并设置一个可混合的类别,在“使用音乐播放器”下描述。

本文档实际上描述了如何configurationAudioSession以用于MediaPlayer框架,但它同样适用于AVAssetReader。

确保您已经调用了“AudioSessionInitialize”,而不会出现奇怪的事情。