【发布时间】:2019-06-03 16:50:49
【问题描述】:
我正在尝试通过检索 ICodecAPI 接口来调整通过 ActivateObject() 创建的 H.264 编码器的属性。 虽然我没有收到错误,但我的设置没有被考虑在内。
代码在 Windows 10 下运行。
我复制了用于创建 IMFSinkWriter 的代码并检索下面的 ICodecAPI。未显示错误处理,但不会产生错误。
我已阅读此thread,这意味着调整 IMFSinkWriter 使用的编码器可能是不可能的,但由于 MSDN 文档上没有任何声明,我想知道是否有人设法将 ICodecAPI 与 IMFSinkWritter 一起使用。
如果不可能,应该怎么做?我需要在 H.264 中编码并流式传输到 MP4。我想更改 GOP、Qp、CABAC 等,这似乎无法通过输出媒体类型进行。 我应该能够单独创建编码器并将其连接到 MP4 文件编写器吗?任何关于如何做到这一点的指针表示赞赏......
hr = encoderToOpen.activate->ActivateObject(__uuidof(IMFTransform), (LPVOID *)&encoderTransform);
hr = encoderTransform->GetAttributes(&attributes);
hr = attributes->SetUINT32(MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS, TRUE);
hr = MFCreateSinkWriterFromURL(fileName, NULL, attributes, &encoder);
// Initialise outputMediaType (code not shown)
hr = encoder->AddStream(outputMediaType, &streamIndex);
hr = encoder->SetInputMediaType(streamIndex, sourceMediaType, NULL);
// Retrieve the ICodecAPI
ICodecAPI *codecApi;
streamIndex = 0;
hr = encoder->GetServiceForStream(streamIndex, GUID_NULL, __uuidof(ICodecAPI), (LPVOID*)&codecApi);
VARIANT v;
hr = codecApi->GetValue(&CODECAPI_AVEncCommonQuality, &v);
v.vt = VT_UI4;
v.ulVal = 8;
hr = codecApi->SetValue(&CODECAPI_AVEncMPVGOPSize, &v);
// Start encoding (code not shown)
【问题讨论】:
-
C++ 显然只是次要相关。我相信代码是用 c++ 而不是 c# 或 Visual Basic 编写的,这只是偶然。您可以考虑通过删除 c++ 标签来向更广泛的受众公开您的问题,并在问题中说明显示的实际代码是使用 c++ 编写的。
-
另外,您的代码中没有单一的错误检查。您可能想使用
hr结果来测试您的调用是否成功。 -
Re-C++ - 好的,谢谢。为清楚起见省略了错误检查,但在我的应用程序中没有生成错误。
-
我也面临同样的问题。你能解决这个问题吗?如果是,请您指导我查看样本或一些文档吗?
标签: h.264 video-encoding ms-media-foundation