1

我正在使用 AVAssetReader 从 iPod 库中读取音频。(见这里)然后我获取读取缓冲区并通过 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];

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

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

4

2 回答 2

1

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

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

于 2011-06-08T04:17:21.570 回答
1

确保您在没有它的情况下调用了“AudioSessionInitialize”,可能会发生奇怪的事情。

于 2011-06-07T22:28:34.490 回答