Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 视频录制挂起在IMFSinkWriter上->;定稿_C++_Windows_Windows 10_H.264_Ms Media Foundation - Fatal编程技术网

C++ 视频录制挂起在IMFSinkWriter上->;定稿

C++ 视频录制挂起在IMFSinkWriter上->;定稿,c++,windows,windows-10,h.264,ms-media-foundation,C++,Windows,Windows 10,H.264,Ms Media Foundation,我已经实现了自定义IMFMediaSink,用于sink writer。工作正常,接收h264视频样本。我没有任何容器,我正在消耗原始h264视频样本。我还没有实现自定义编写器,我正在使用API将自定义媒体接收器包装到编写器提供的框架中 我无法实现正常关机,IMFSinkWriter::Finalize()永远不会返回。当我实现IMFSinkWriterCallback时,IMFSinkWriter::Finalize()立即返回,但从未调用我的IMFSinkWriterCallback::On

我已经实现了自定义IMFMediaSink,用于sink writer。工作正常,接收h264视频样本。我没有任何容器,我正在消耗原始h264视频样本。我还没有实现自定义编写器,我正在使用API将自定义媒体接收器包装到编写器提供的框架中

我无法实现正常关机,
IMFSinkWriter::Finalize()
永远不会返回。当我实现
IMFSinkWriterCallback
时,
IMFSinkWriter::Finalize()
立即返回,但从未调用我的
IMFSinkWriterCallback::OnFinalize

在使用nvenc和MS软件编码器进行的100%测试中,问题再次出现

编写器属性:

MF_LOW_LATENCY = TRUE
MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS = TRUE (1)
MF_READWRITE_DISABLE_CONVERTERS = FALSE (2)
MF_SINK_WRITER_DISABLE_THROTTLING = TRUE
MF_SINK_WRITER_D3D_MANAGER
MF_SINK_WRITER_ASYNC_CALLBACK
(1) 两者都试过了,结果一样

(2) 需要转换器,因为nvenc只支持YUV,并且我在输入时有RGB纹理

输出媒体类型(它是固定的,我使用由
MFCreateSimpleTypeHandler
API创建的内置处理程序)

输入媒体类型:

MF_MT_MAJOR_TYPE = MFMediaType_Video
MF_MT_SUBTYPE = MFVideoFormat_RGB32
MF_MT_INTERLACE_MODE = MFVideoInterlace_Progressive
MF_MT_FRAME_SIZE = { 3840, 2160 }
MF_MT_FRAME_RATE = { 60, 1 }
MF_MT_PIXEL_ASPECT_RATIO = { 1, 1 }
当不使用IMFSinkWriterCallback时,以下是挂起时的调用堆栈:

ntdll.dll!_NtWaitForSingleObject@12 ()
KernelBase.dll!WaitForSingleObjectEx()
mfreadwrite.dll!CMFSinkWriter::InternalFinalize(void)
mfreadwrite.dll!CMFSinkWriter::Finalize(void)
MFTrace没有任何与finalize相关的内容,即使使用
-k All

13700,3C60 19:01:25.79566 CMFTransformDetours::ProcessOutput @02EA6E3C failed hr=0xC00D6D72 MF_E_TRANSFORM_NEED_MORE_INPUT
13700,2A98 19:01:25.80250 CMFTransformDetours::ProcessOutput @1A6CEF38 Stream ID 0, Sample @1C244F30, Time 1216ms, Duration 16ms, Buffers 1, Size 12441600B, MFSampleExtension_CleanPoint=1;MFSampleExtension_Interlaced=0
13700,2098 19:01:25.80254 CMFTransformDetours::ProcessInput @02EA6E3C Stream ID 0, Sample @1C244F30, Time 1216ms, Duration 16ms, Buffers 1, Size 12441600B, MFSampleExtension_CleanPoint=1;MFSampleExtension_Interlaced=0
13700,2A98 19:01:25.80256 CMFTransformDetours::ProcessOutput @1A6CEF38 failed hr=0xC00D6D72 MF_E_TRANSFORM_NEED_MORE_INPUT
13700,2A98 19:01:25.80266 CMFTransformDetours::ProcessMessage @1A6CEF38 Message type=0x00000001 MFT_MESSAGE_COMMAND_DRAIN, param=00000000
13700,2A98 19:01:25.80267 CMFTransformDetours::ProcessOutput @1A6CEF38 failed hr=0xC00D6D72 MF_E_TRANSFORM_NEED_MORE_INPUT
13700,2098 19:01:25.81669 CMFTransformDetours::ProcessOutput @02EA6E3C Stream ID 0, Sample @1FB68CF8, Time 1216ms, Duration 16ms, Buffers 1, Size 680B, {2B5D5457-5547-4F07-B8C8-B4A3A9A1DAAC}=1;{73A954D4-09E2-4861-BEFC-94BD97C08E6E}=12166667 (0,12166667);{9154733F-E1BD-41BF-81D3-FCD918F71332}=65535;{973704E6-CD14-483C-8F20-C9FC0928BAD5}=1;MFSampleExtension_CleanPoint=0;{B2EFE478-F979-4C66-B95E-EE2B82C82F36}=16 (0,16)
13700,82C 19:01:25.81674 CMFTransformDetours::ProcessOutput @02EA6E3C failed hr=0xC00D6D72 MF_E_TRANSFORM_NEED_MORE_INPUT
13700,82C 19:01:25.81674 CMFTransformDetours::ProcessMessage @02EA6E3C Message type=0x00000001 MFT_MESSAGE_COMMAND_DRAIN, param=00000000
13700,82C 19:01:25.81674 CMFTransformDetours::ProcessOutput @02EA6E3C failed hr=0xC00D6D72 MF_E_TRANSFORM_NEED_MORE_INPUT
13700,1F54 19:01:27.24237 CKernel32ExportDetours::OutputDebugStringA @ D3D11 WARNING: Process is terminating. Using simple reporting. Please call ReportLiveObjects() at runtime for standard reporting. [ STATE_CREATION WARNING #0: UNKNOWN] 
13700,1F54 19:01:27.24255 CKernel32ExportDetours::OutputDebugStringA @ D3D11 WARNING: Live Producer at 0x0311D91C, Refcount: 13. [ STATE_CREATION WARNING #0: UNKNOWN] 
当我在挂起后终止进程时,预期会出现有关活动D3D资源的警告


知道发生了什么事吗?我认为作者可能会等待这些SPS/PPS神奇斑点的到来,但它从未发生过。是否有方法指示h264编码器在某处输出SP/PP?

您已经实现了自定义IMFMediaSink,因此我想您也已经实现了IMFStreamSink

使用Mediafoundation以通常的方式执行此操作,可以在IMFMediaSink和IMFStreamSink之间进行循环COM引用。这就是IMFMediaSink接口中的关闭方法存在的原因

如果使用自定义MediaSink的程序没有在正确的位置调用Shutdown,则会出现内存泄漏

从您的IMFSinkWriterCallback问题中,我们没有足够的信息来查找问题所在

此外,“自定义IMFMediaSink”和“IMFSinkWriter”也不清楚。您是否也在实现IMFSinkWriter

EDIT1

只有两件事:

在调用此函数之前,先调用CoInitialize(Ex)和MFStartup

使用完介质接收器后,调用介质接收器的IMFMediaSink::Shutdown方法。(接收器写入程序不会关闭媒体接收器。)在调用媒体接收器上的关机之前,请释放接收器写入程序

您是否正确地发布了接口

在内部,此方法调用IMFStreamSink::PlaceMarker来为媒体接收器上的每个流放置段结束标记

您是否处理此消息(MFSTREAMSINK\u MARKER\u ENDOFSEGMENT)

我们不知道您如何处理CriticalSection/Event/CircularReference,因此很难找到问题

EDIT2

是否有方法指示h264编码器在某处输出SPS/PPS

通常,对于h264视频格式,在IMFStreamSink上调用SetCurrentMediaType时,需要获取属性MF_MT_MPEG_SEQUENCE_标头(BLOB类型)(假设您实现了IMFMediaTypeHandler)

EDIT3

你能提供一个真实的(这是我认为应用程序应该是这样的):

我不记得你的自定义接收器是否创建了mp4文件。如果是,则必须在IMFSinkWriter::Finalize中生成ftpy/moov atom

EDIT4

您还可以阅读以下内容:


由于没有源代码,这是我能给出的唯一答案。

你能把代码发布在github或其他地方吗?另外,当使用
IMFSinkWriter回调时,
IMFSinkWriter::Finalize
是否使用
S_OK
退出?@RudolfsBundulis这是招聘工作,我会询问客户,但我认为他们不会允许。是的,当传递IMFSinkWriterCallback时,IMFSinkWriter::Finalize返回
S_OK
,速度非常快。这就是我实现解决方法的方式:我在构建writer时传递回调,完成后调用Finalize,等待一段时间IMFSinkWriterCallback::OnFinalize到达(使用Win32事件),如果没有发生,我继续,释放()writer COM接口,然后调用Shutdown()和Release()在我的IMFMediaSink对象上。是的,我还实现了自定义流接收器。不,我使用的是框架提供的编写器,由
MFCreateSinkWriterFromMediaSink
API创建。我不记得在哪里看到的,但我的印象是,我必须先关掉书写器,然后再关掉水槽。我关水槽没问题。写入程序有此问题。
MFCreateSinkWriterFromMediaSink
文章中的评论说“接收器写入程序没有关闭媒体接收器…在调用媒体接收器上的关机之前释放接收器写入程序”。而
IMFSinkWriter::Finalize
的文档说明“如果不调用Finalize,则媒体接收器的输出可能不完整或无效”。如果我错了,请纠正我,但从这两篇文章中,正确的关闭顺序(意味着我需要完整有效的视频流)必须如下:
writer->Finalize();writer->Release();sink->Shutdown()第一个挂起。“你处理好这条消息了吗?”是的,我收到了这条消息,但我没有做任何特殊的事情,只需检查是否关机并返回s_OK。我应该做更多吗?“您是否正确地释放了接口?”我是这样做的,但问题发生在释放接收器之前。“假设您实现了IMFMediaTypeHandler”我没有,我使用的是由MFCreateSimpleTypeHandler创建的处理程序。但我不确定问题是否出在SPS/PPS上,这是基于我以前使用MF的经验得出的想法。在我的测试应用程序中,我还有一个下游接收器写入程序,由另一个API创建,
MFCreateSinkWriterFromURL
。第二位作家不知道?
13700,3C60 19:01:25.79566 CMFTransformDetours::ProcessOutput @02EA6E3C failed hr=0xC00D6D72 MF_E_TRANSFORM_NEED_MORE_INPUT
13700,2A98 19:01:25.80250 CMFTransformDetours::ProcessOutput @1A6CEF38 Stream ID 0, Sample @1C244F30, Time 1216ms, Duration 16ms, Buffers 1, Size 12441600B, MFSampleExtension_CleanPoint=1;MFSampleExtension_Interlaced=0
13700,2098 19:01:25.80254 CMFTransformDetours::ProcessInput @02EA6E3C Stream ID 0, Sample @1C244F30, Time 1216ms, Duration 16ms, Buffers 1, Size 12441600B, MFSampleExtension_CleanPoint=1;MFSampleExtension_Interlaced=0
13700,2A98 19:01:25.80256 CMFTransformDetours::ProcessOutput @1A6CEF38 failed hr=0xC00D6D72 MF_E_TRANSFORM_NEED_MORE_INPUT
13700,2A98 19:01:25.80266 CMFTransformDetours::ProcessMessage @1A6CEF38 Message type=0x00000001 MFT_MESSAGE_COMMAND_DRAIN, param=00000000
13700,2A98 19:01:25.80267 CMFTransformDetours::ProcessOutput @1A6CEF38 failed hr=0xC00D6D72 MF_E_TRANSFORM_NEED_MORE_INPUT
13700,2098 19:01:25.81669 CMFTransformDetours::ProcessOutput @02EA6E3C Stream ID 0, Sample @1FB68CF8, Time 1216ms, Duration 16ms, Buffers 1, Size 680B, {2B5D5457-5547-4F07-B8C8-B4A3A9A1DAAC}=1;{73A954D4-09E2-4861-BEFC-94BD97C08E6E}=12166667 (0,12166667);{9154733F-E1BD-41BF-81D3-FCD918F71332}=65535;{973704E6-CD14-483C-8F20-C9FC0928BAD5}=1;MFSampleExtension_CleanPoint=0;{B2EFE478-F979-4C66-B95E-EE2B82C82F36}=16 (0,16)
13700,82C 19:01:25.81674 CMFTransformDetours::ProcessOutput @02EA6E3C failed hr=0xC00D6D72 MF_E_TRANSFORM_NEED_MORE_INPUT
13700,82C 19:01:25.81674 CMFTransformDetours::ProcessMessage @02EA6E3C Message type=0x00000001 MFT_MESSAGE_COMMAND_DRAIN, param=00000000
13700,82C 19:01:25.81674 CMFTransformDetours::ProcessOutput @02EA6E3C failed hr=0xC00D6D72 MF_E_TRANSFORM_NEED_MORE_INPUT
13700,1F54 19:01:27.24237 CKernel32ExportDetours::OutputDebugStringA @ D3D11 WARNING: Process is terminating. Using simple reporting. Please call ReportLiveObjects() at runtime for standard reporting. [ STATE_CREATION WARNING #0: UNKNOWN] 
13700,1F54 19:01:27.24255 CKernel32ExportDetours::OutputDebugStringA @ D3D11 WARNING: Live Producer at 0x0311D91C, Refcount: 13. [ STATE_CREATION WARNING #0: UNKNOWN]