想法是在使用Media Foundation进行视频转码时,使用Media Foundation转换,例如Video Stabilization MFT。
[不使用MFT时,代码工作正常。
使用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。
我想念什么?
这很奇怪,您在IMFMediaType上设置了属性,而不是在视频稳定MFT上设置了属性:
ptype->SetUINT32(MF_VIDEODSP_MODE, MFVideoDSPMode_Stabilization);
ptype2->SetUINT32(MF_VIDEODSP_MODE, MFVideoDSPMode_Stabilization);
应该是:
trs->SetUINT32(MF_VIDEODSP_MODE, MFVideoDSPMode_Stabilization);
似乎您不明白自己在做什么。