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

Posted

技术标签:

【中文标题】启动 AVAssetReader 停止对远程 I/O AudioUnit 的回调【英文标题】:Starting an AVAssetReader stopping callbacks to a Remote I/O AudioUnit 【发布时间】:2011-06-02 01:44:14 【问题描述】:

我正在使用 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];

我使用的 AudioUnit 设置与 here 列出的相同

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

【问题讨论】:

【参考方案1】:

您必须创建一个 Audiosession 并设置一个可混合的类别,如“使用音乐播放器”下的 here 所述。

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

【讨论】:

我使用的是“kAudioSessionProperty_AudioCategory - kAudioSessionCategory_MediaPlayback”,所以我需要确保将“kAudioSessionProperty_OverrideCategoryMixWithOthers”设置为 true。【参考方案2】:

确保您已调用“AudioSessionInitialize”,否则可能会发生奇怪的事情。

【讨论】:

以上是关于启动 AVAssetReader 停止对远程 I/O AudioUnit 的回调的主要内容,如果未能解决你的问题,请参考以下文章

第五十七篇AVAssetReader和AVAssetWrite 对视频进行编码

通过 C# 代码在远程机器上启动和停止 IIS [关闭]

如何远程启动和停止服务

如何以编程方式停止/启动远程计算机上的计划任务?

在 AVAssetReader 中设置时间范围会导致冻结

如何使用 C# 在远程机器上启动/停止进程?