Использование DirectShow в C ++ для декодирования видео MP4 с потоком H.264

У меня есть видео 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, это ДЕЙСТВИТЕЛЬНО Не работает, но 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

Любая помощь будет принята с благодарностью!

С Уважением,
Грэхем

3

Решение

В Windows нет стандартного / стандартного демультиплексора MP4, поэтому необходимо установить его на расширенный DirectShow для покрытия MP4.

  • вам нужен демультиплексор с правильной битовой разрядностью (32 против 64 бит), установленный для соответствия битовой коде вашего приложения / (или GraphEdit)
  • VLC не имеет значения, поскольку он имеет свой собственный встроенный демультиплексор
  • вам также нужен декодер H.264, и вы, кажется, уже его имеете

Ваш код прав, но этот метод построения графа не совсем реалистичен. Прежде всего, вам нужно узнать, получаете ли вы какой-либо полезный код ошибки (возможно, на RenderFile вызов).

Если GraphEdit Win32 работает в этой системе, все необходимые компоненты (фильтры) должны быть доступны. Разница в том, что GraphEdit строит график не так, как вы. Вместо этого он использует IGraphBuilder::AddSourceFilter для данного файла добавить начальный фильтр, а затем визуализировать его контакты. Если вы воспользуетесь тем же подходом и на последнем шаге добавите фильтр VMR для видеопрезентации, это сработает хорошо.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]