У меня есть видео 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
Любая помощь будет принята с благодарностью!
С Уважением,
Грэхем
В Windows нет стандартного / стандартного демультиплексора MP4, поэтому необходимо установить его на расширенный DirectShow для покрытия MP4.
Ваш код прав, но этот метод построения графа не совсем реалистичен. Прежде всего, вам нужно узнать, получаете ли вы какой-либо полезный код ошибки (возможно, на RenderFile
вызов).
Если GraphEdit Win32 работает в этой системе, все необходимые компоненты (фильтры) должны быть доступны. Разница в том, что GraphEdit строит график не так, как вы. Вместо этого он использует IGraphBuilder::AddSourceFilter
для данного файла добавить начальный фильтр, а затем визуализировать его контакты. Если вы воспользуетесь тем же подходом и на последнем шаге добавите фильтр VMR для видеопрезентации, это сработает хорошо.
Других решений пока нет …