启动AVAssetReader,停止对远程I / O AudioUnit的回调

时间:2011-06-02 01:44:15

标签: iphone objective-c ios audiounit

我正在使用AVAssetReader从iPod库中读取音频。 (see here)然后我拿起读缓冲区并通过AudioUnit播放它。我试图折射代码,以便在播放时在音频中流式传输。但是,如果AVAssetReader正在运行,AudioUnit将停止接收对其kAudioUnitProperty_SetRenderCallback的调用。

我简化了我的代码,只在AudioUnits回调中播放文件...

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];

我使用的是与列出here

相同的AudioUnit设置

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

2 个答案:

答案 0 :(得分:1)

确保您调用了'AudioSessionInitialize',而不会发生奇怪的事情。

答案 1 :(得分:1)

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

本文档实际上描述了如何配置AudioSession以与MediaPlayer框架一起使用,但它同样适用于AVAssetReader。