【发布时间】:2016-09-29 07:49:45
【问题描述】:
由于某种原因,我无法解码 H.264。 输入/输出配置很顺利,就像输入/输出缓冲区创建一样。
我正在手动向解码器提供从直播流中解复用的 H.264。因此,我使用 MFVideoFormat_H264_ES 作为媒体子类型。解码速度很慢,解码后的帧完全是垃圾。其他解码器正在正确解码相同的流。
奇怪的是,一旦 ProcessInput() 返回 MF_E_NOTACCEPTING,下面的 ProcessOutput() 就会返回 MF_E_TRANSFORM_NEED_MORE_INPUT。根据 MSDN,这绝不应该发生。
谁能提供一些具体的信息来说明如何做到这一点? (假设 MF H.264 可以正常工作,我对此表示严重怀疑)。
我愿意提供额外的信息,但我不知道有人可能需要什么来提供帮助。
编辑: 我应该什么时候将输入缓冲区中的字节数重置为零? 顺便说一句,当 ProcessOutput() 提供一些东西(垃圾)时,我正在重置输出缓冲区。
编辑2: 在不将输入缓冲区的当前缓冲区大小重置为 0 的情况下,我设法获得了一些半有效的输出。半有效是指在每个成功的 ProcessOutput() 上,我都会收到一个 YUV 图像,其中当前图像包含比前一帧更多的解码宏块。框架的其余部分是黑色的。因为我没有重置大小,所以这会在一段时间后停止。所以,我想重置缓冲区大小有问题,我想我应该在整个帧完成(或不完成)时收到一些通知。
编辑3: 创建输入缓冲区时,GetInputStreamInfo() 返回 4096 作为输入缓冲区大小。对齐0。但是,4k是不够的。增加到 4MB 有助于逐帧解压缩帧片段。仍然必须弄清楚是否有办法判断整个帧何时解码。
【问题讨论】:
-
解码器的SetInputType和SetOutputType怎么调用?在第一次调用 ProcessInput 之前,您是否发送过 MFT_MESSAGE_NOTIFY_BEGIN_STREAMING 和 MFT_MESSAGE_NOTIFY_START_OF_STREAM 消息?
-
你不应该重置输入和输出缓冲区。引用自 MSDN:“如果调用方分配媒体样本,则媒体样本必须包含一个足够大的缓冲区来保存输出数据。要找到缓冲区要求,请调用 GetOutputStreamInfo。MFT 将输出数据写入到缓冲区,覆盖缓冲区中已经存在的任何数据。” msdn.microsoft.com/en-us/library/windows/desktop/…
-
是的,两条消息都已成功发送, MFT_MESSAGE_NOTIFY_BEGIN_STREAMING 和 MFT_MESSAGE_NOTIFY_START_OF_STREAM 。 SetInputType & SetOutputType 进展顺利。在解码时,我收到了一个 MF_E_TRANSFORM_STREAM_CHANGE 并成功处理了它。当谈到缓冲区覆盖时,事情并没有像 MSDN 描述的那样工作。在某些解码器上,一旦 ProcessOutput() 传递了某些内容,我必须将缓冲区长度重置为 0。
-
只是一个更新,如果我没有在 ProcesOutput() 成功后将输出缓冲区重置为零,我会收到错误 (E_FAIL),所以必须保留。
标签: h.264 ms-media-foundation transport-stream