尝试在Media Foundation编码中使用MFT

问题描述 投票:0回答:1

想法是在使用Media Foundation进行视频转码时,使用Media Foundation转换,例如Video Stabilization MFT

[不使用MFT时,代码工作正常。

  • 为源文件创建IMFSourceReader-确定
  • 为目标文件创建IMFSinkWriter-确定
  • 向作者添加描述视频的流-确定
  • 添加音频流-确定
  • 设置视频和音频的输入类型-确定
  • 循环读取样本并将其发送到接收器写入器,确定。

使用MFT时,这些都是事实。要创建MFT(已删除错误检查):

CComPtr<IMFTransform> trs;
trs.CoCreateInstance(CLSID_CMSVideoDSPMFT);
std::vector<DWORD> iids;
std::vector<DWORD> oods;
DWORD is = 0, os = 0;
hr = trs->GetStreamCount(&is, &os);
iids.resize(is);
oods.resize(os);
hr = trs->GetStreamIDs(is, iids.data(), os, oods.data());
CComPtr<IMFMediaType> ptype;
CComPtr<IMFMediaType> ptype2;
MFCreateMediaType(&ptype);
MFCreateMediaType(&ptype2);
SourceVideoType->CopyAllItems(ptype);
SourceVideoType->CopyAllItems(ptype2);

ptype->SetUINT32(MF_VIDEODSP_MODE, MFVideoDSPMode_Stabilization);
//                LogMediaType(ptype);
ptype2->SetUINT32(MF_VIDEODSP_MODE, MFVideoDSPMode_Stabilization);
//              LogMediaType(ptype2);
hr = trs->SetInputType(iids[0], ptype, 0);
auto hr2 = trs->SetOutputType(oods[0], ptype2, 0);
if (SUCCEEDED(hr) && SUCCEEDED(hr2))
{
    VideoStabilizationMFT = trs;
}

此代码有效-MFT已成功配置。但是,在我的示例处理循环中:

// pSample = sample got from the reader
CComPtr<IMFSample> pSample2;
LONGLONG dur = 0, tim = 0;
pSample->GetSampleDuration(&dur);
pSample->GetSampleTime(&tim);

trs->ProcessInput(0, pSample, 0);
MFT_OUTPUT_STREAM_INFO si = {};
trs->GetOutputStreamInfo(0, &si);

// Create pSample2 
MFCreateSample(&pSample2);
CComPtr<IMFMediaBuffer> bb;
MFCreateMemoryBuffer(si.cbSize, &bb);
pSample2->AddBuffer(bb);

DWORD st = 0;
hr = trs->ProcessOutput(0, 1, &db, &st);

此最后一个调用最初以MF_E_TRANSFORM_NEED_MORE_INPUT失败,我可以理解MFT需要多个样本来实现稳定,所以我为编写者跳过了此样本。

当呼叫成功时,我得到没有时间或持续时间的样本。即使我手动设置时间和持续时间,接收器编写器也会失败,并显示E_INVALIDARG。

我想念什么?

c++ winapi ms-media-foundation
1个回答
-1
投票

这很奇怪,您在IMFMediaType上设置了属性,而不是在视频稳定MFT上设置了属性:

ptype->SetUINT32(MF_VIDEODSP_MODE, MFVideoDSPMode_Stabilization);
ptype2->SetUINT32(MF_VIDEODSP_MODE, MFVideoDSPMode_Stabilization);

应该是:

trs->SetUINT32(MF_VIDEODSP_MODE, MFVideoDSPMode_Stabilization);

似乎您不明白自己在做什么。

© www.soinside.com 2019 - 2024. All rights reserved.