有效地将异步 IMFSourceReader 连接到同步 IMFTransform

Efficiently connecting an asynchronous IMFSourceReader to a synchronous IMFTransform

给定异步 IMFSourceReader 连接到仅同步 IMFTransform。

然后对于 IMFSourceReaderCallback::OnReadSample() 回调,最好不要在 OnReadSample 中直接调用 IMFTransform::ProcessInput,而是将生成的样本推送到另一个队列以供另一个线程调用转换 ProcessInput在?

或者我只是复制相同的工作源 reader 通常在内部进行?或者换一种方式在 OnReadSample 中工作 运行 阻止源中任何进一步解码工作的风险 reader 否则可能会更异步地发生?

所以我建议如下:

WorkQueue transformInputs;
...

//  Called back async
HRESULT OnReadSampleCallback(... IMFSample* sample)
{
    // Push sample and return immediately
    Push(transformInputs, sample); 
}

//  Different worker thread awoken for transformInputs queue samples
void OnTransformInputWork()
{
    //  Transform object is not async capable
    transform->TransformInput(0, Pop(transformInputs), 0);
    ...
}

这里略有提及,不详述'Implementing the Callback Interface': https://docs.microsoft.com/en-us/windows/win32/medfound/using-the-source-reader-in-asynchronous-mode

或者它是否完全取决于来源 reader 在内部设置且不易确定?

IMFSourceReaderCallback::OnReadSample 中执行长时间阻塞操作不是一个好主意。没有什么是致命的或严重的,但这不是预期的用途。

考虑到您之前关于音频格式转换的问题,音频样本数据转换速度足够快,可以在此类回调中发生。

此外,它不明确或没有记录(取决于实际实现),ProcessInput 通常是即时的并且仅引用输入数据。 ProcessOutput 在这种情况下计算量很大。如果您不在同一个回调中直接执行 ProcessOutput,您可能会 运行 进入 MFT 不再接受输入的情况,因此无论如何您都必须实现一个队列。

考虑到所有这些,假设您的处理不是太繁重,您将只在回调中执行忽略性能影响的处理,否则您将开始执行队列。