在使用Media Foundation将视频录制最终录制为.mp4的视频时,出现问题,而该调用IMFSinkWriter->Finalize();将永远挂起。它并非总是会发生,并且几乎可以在任何计算机上发生(在Windows服务器上看到的7、8、10)。Flush()会先在音频和视频流上调用,并且不会在Flush和之间添加新样本Finalize。关于什么可能导致Finalize永远死机的任何想法?
我尝试过的事情:
HRESULTs以检查是否有任何问题(在进行下一行代码之前已经检查了它们)一切恢复为
S_OK,没有看到任何问题
IMFSinkWriterCallback在流上添加,以在流处理标记(每10个样本添加一个标记)并完成处理时获取回调Finalize()自添加此功能以来一直无法复制,但这将为我提供有关工作时发生的一切的最佳信息。
Finalize()使用找不到很多样本,看起来我的代码与发现的代码相似
在可能重现此问题的计算机上,编码器在AMD H.264硬件MFT编码器和H264编码器MFT之间有所不同。版本似乎无关紧要,有些机器是最新的视频驱动程序。
这是一些未经任何HRESULT检查的代码示例(使代码量加倍,所以我取出了它)
构建接收器样本:
CComPtr<IMFAttributes> pAttr;
::MFCreateAttributes( &pAttr, 4 );
pAttr->SetGUID( MF_TRANSCODE_CONTAINERTYPE, GetFileContainerType() );
pAttr->SetUINT32( MF_LOW_LATENCY, FALSE ); // Allows better multithreading
pAttr->SetUINT32( MF_SINK_WRITER_DISABLE_THROTTLING, TRUE ); // Does not block
pAttr->SetUINT32( MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS, TRUE );
m_pCallback.Attach( new MFSinkWriterCallback() );
pAttr->SetUnknown( MF_SINK_WRITER_ASYNC_CALLBACK, m_pCallback );
::MFCreateSinkWriterFromURL( m_strFilename.c_str(), NULL, pAttr, &m_pSink );
if …Run Code Online (Sandbox Code Playgroud)