gpt4 book ai didi

c++ - Windows MFT(媒体基础转换)解码器未返回正确的采样时间或持续时间

转载 作者:可可西里 更新时间:2023-11-01 09:32:58 25 4
gpt4 key购买 nike

要使用 Windows Media Foundation Transform 解码 H264 流,目前的工作流程是这样的:

IMFSample sample;
sample->SetTime(time_in_ns);
sample->SetDuration(duration_in_ns);
sample->AddBuffer(buffer);

// Feed IMFSample to decoder
mDecoder->ProcessInput(0, sample, 0);

// Get output from decoder.
/* create outputsample that will receive content */ { ... }
MFT_OUTPUT_DATA_BUFFER output = {0};
output.pSample = outputsample;
DWORD status = 0;
HRESULT hr = mDecoder->ProcessOutput(0, 1, &output, &status);
DWORD status = 0;
hr = mDecoder->ProcessOutput(0, 1, &output, &status);
if (output.pEvents) {
// We must release this, as per the IMFTransform::ProcessOutput()
// MSDN documentation.
output.pEvents->Release();
output.pEvents = nullptr;
}

if (hr == MF_E_TRANSFORM_STREAM_CHANGE) {
// Type change, probably geometric aperture change.
// Reconfigure decoder output type, so that GetOutputMediaType()
} else if (hr == MF_E_TRANSFORM_NEED_MORE_INPUT) {
// Not enough input to produce output.
} else if (!output.pSample) {
return S_OK;
} else }
// Process output
}

}

当我们将所有数据提供给 MFT 解码器后,我们必须将其排出:

mDecoder->ProcessMessage(MFT_MESSAGE_COMMAND_DRAIN, 0);

现在,WMF H264 解码器的一件事是,无论 h264 滑动窗口的大小如何,在使用超过 30 个压缩的 h264 帧调用之前,它通常不会输出任何内容。延迟非常高...

我遇到了一个很麻烦的问题。视频仅由关键帧组成,只有 15 帧,每帧长 2 秒,第一帧的呈现时间为非零(此流来自实时内容,因此第一帧通常为 epos 时间)因此,如果不耗尽解码器,解码器将不会输出任何内容,因为它没有收到足够的帧。

但是,一旦解码器被排空,解码帧就会出来。然而,MFT 解码器将所有持续时间仅设置为 33.6 毫秒,第一个样本的呈现时间始终为 0。原来的持续时间和演示时间已经丢失。

如果你提供超过 30 帧给 h264 解码器,那么 duration 和 pts 都是有效的...

我还没有找到让 WMF 解码器输出具有正确值的样本的方法。看来,如果您必须在解码器自行输出任何样本之前排空解码器,那么它就完全坏了...

有没有人遇到过这样的问题?你是如何绕过它的?

提前致谢

编辑:视频样本可在 http://people.mozilla.org/~jyavenard/mediatest/fragmented/1301869.mp4 上获得由于上述问题,使用 Firefox 播放此视频会导致播放速度极快。

最佳答案

我不确定您的工作流程是否正确。我认为你应该这样做:

do
{
...
hr = mDecoder->ProcessInput(0, sample, 0);
if(FAILED(hr))
break;
...
hr = mDecoder->ProcessOutput(0, 1, &output, &status);
if(FAILED(hr) && hr != MF_E_TRANSFORM_NEED_MORE_INPUT)
break;
}
while(hr == MF_E_TRANSFORM_NEED_MORE_INPUT);

if(SUCCEEDED(hr))
{
// You have a valid decoded frame here
}

想法是在 ProcessOutput 返回 MF_E_TRANSFORM_NEED_MORE_INPUT 时继续调用 ProcessInput/ProcessOuptut。 MF_E_TRANSFORM_NEED_MORE_INPUT 表示解码器需要更多输入。我认为有了这个循环,您就不需要耗尽解码器了。

关于c++ - Windows MFT(媒体基础转换)解码器未返回正确的采样时间或持续时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39695131/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com