gpt4 book ai didi

c++ - 在 C++ 中使用 DirectShow 解码带有 H.264 流的 MP4 视频

转载 作者:太空狗 更新时间:2023-10-29 23:18:10 27 4
gpt4 key购买 nike

我有一个包含单个 H.264 流但没有音频流的 MP4 视频。我想使用带有 C++ 的 DirectShow 来解码视频,但我在设置 DirectShow 过滤器时遇到问题,希望有人能提供帮助?

这是我使用 DirectShow 解码 WMV3 流的设置代码,我运行良好:

hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&m_pGraph);

if (SUCCEEDED(hr)) hr = CoCreateInstance(CLSID_VideoMixingRenderer9, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&m_pFilter);
if (SUCCEEDED(hr)) hr = m_pFilter->QueryInterface(IID_IVMRFilterConfig9, reinterpret_cast<void**>(&filterConfig));
if (SUCCEEDED(hr)) hr = filterConfig->SetRenderingMode( VMR9Mode_Renderless );
if (SUCCEEDED(hr)) hr = filterConfig->SetNumberOfStreams(2);
if (SUCCEEDED(hr)) hr = SetAllocatorPresenter( m_pFilter, g_pMainWindow );
if (SUCCEEDED(hr)) hr = m_pGraph->AddFilter(m_pFilter, L"Video Mixing Renderer 9");
if (SUCCEEDED(hr)) hr = m_pGraph->QueryInterface(IID_IMediaControl, reinterpret_cast<void**>(&m_pMediaControl));
if (SUCCEEDED(hr)) hr = m_pGraph->QueryInterface(IID_IBasicAudio, reinterpret_cast<void**>(&m_pBasicAudio));
if (SUCCEEDED(hr)) hr = m_pGraph->RenderFile( lpFilename, NULL );

但是,我想不出解码 MP4 的正确设置。正如在其他帖子中发现的那样,我已经安装了 3ivx 和 ffdshow,现在 GraphEdit 可以打开我的文件并显示正确的图形(我想 - 我在 64 位机器上,当我运行 GraphEdit 的 64 位版本时,这 DOESN 'T 工作,但 32 位的工作......这可能与它有关吗?)。 VLC 可以很好地播放我的视频。

我在整个互联网上搜索了特定于此的示例,但找不到任何示例。

我的视频文件格式如下(ffmpeg输出):

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test.mp4':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: mp42mp41
creation_time : 2013-01-16 19:14:52
Duration: 00:05:25.62, start: 0.033367, bitrate: 3396 kb/s
Stream #0:0(eng): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 3393 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc
Metadata:
creation_time : 2013-01-16 19:14:52
handler_name : ?Mainconcept Video Media Handler

如有任何帮助,我们将不胜感激!

问候,格雷厄姆

最佳答案

Windows 中没有标准/默认的 MP4 解复用器,因此您必须安装一个来扩展 DirectShow 以涵盖 MP4。

  • 您需要安装适当位数(32 位与 64 位)的多路分解器以匹配您的代码/应用程序(或 GraphEdit)的位数
  • VLC 无关紧要,因为它有自己内置的解复用器
  • 你还需要H.264解码器,你好像已经有了

您的代码差不多是正确的,但是这种构建图形的方法不太可靠。首先,您需要查看是否收到任何有用的错误代码(您可能在 RenderFile 调用中收到)。

如果 GraphEdit Win32 在此系统上运行,则所有必需的组件(过滤器)都应该可用。不同之处在于 GraphEdit 不会像您那样构建图形。相反,它使用 IGraphBuilder::AddSourceFilter 为给定文件添加起始过滤器,然后呈现其引脚。如果您采用相同的方法并在最后一步添加用于视频演示的 VMR 过滤器,那么效果会很好。

关于c++ - 在 C++ 中使用 DirectShow 解码带有 H.264 流的 MP4 视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14512963/

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