繁体   English   中英

在C ++中使用DirectShow使用H.264流解码MP4视频

[英]Using DirectShow in C++ to decode an MP4 video with a H.264 stream

我有一个MP4视频,包含一个H.264流,没有音频流。 我想使用DirectShow和C ++解码视频,但是我在设置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位机器上,当我运行64位版本的GraphEdit这个DOESN '工作,但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过滤器用于视频演示,这将很好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM