Передача из файла типа 2

[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код использовал MediaPlayer, IMFMediaEngine и аудио- и видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, использующий устаревшие API, чтобы по возможности использовать новые API.]

Чтобы передать файл типа 2 во время предварительного просмотра, используйте диаграмму фильтров, показанную на следующей схеме.

Передача type-2 с предварительным просмотром

Файл типа 2 содержит два потока: один аудиопоток и видеопоток с кодировкой DV. Этот график использует фильтр DV Muxer для объединения аудио- и видеопотоков. Он отправляет поток с чередованием в фильтр MSDV, но разделяет поток снова для предварительного просмотра.

Постройте этот граф следующим образом:

// Add the DV Mux filter to the graph.
IBaseFilter *pDVMux;
hr = CoCreateInstance(CLSID_DVMux, 0, CLSCTX_INPROC_SERVER
    IID_IBaseFilter, reinterpret_cast<void**>)(&pDVMux));
hr = pGraph->AddFilter(pDVMux, L"DV Mux");

// Add the File Source filter to the graph.
IBaseFilter *pFileSource;
hr = pGraph->AddSourceFilter(L"C:\\Example2.avi", L"Source", 
    &pFileSource);

hr = pBuilder->RenderStream(0, 0, pFileSource, 0, pDVMux);
hr = pBuilder->RenderStream(0, 0, pFileSource, 0, pDVMux);

// Add the Infinite Pin Tee filter to the graph.
IBaseFilter *pTee;
hr = CoCreateInstance(CLSID_InfTee, 0, CLSCTX_INPROC_SERVER
    IID_IBaseFilter, reinterpret_cast<void**>)(&pTee));
hr = pGraph->AddFilter(pTee, L"Tee");

hr = pBuilder->RenderStream(0, 0, pDVMux, 0, pTee);
hr = pBuilder->RenderStream(0, 0, pTee, 0, pDV);
hr = pBuilder->RenderStream(0, &MEDIATYPE_Interleaved, pTee, 0, 0);

Этот код выполняет несколько вызовов RenderStream:

Первые два соединяют исходный фильтр с разделителями AVI и разделителя AVI с DV Mux. В первом вызове Построитель графов захвата автоматически добавляет разделитель AVI к графу и подключает один из выходных контактов сплиттера AVI к DV Mux. Во втором вызове построитель Графа захвата находит второй выходной контакт сплиттера AVI и подключает его к DV Mux.

Третий вызов RenderStream подключает dv Muxer к фильтру Бесконечное закрепление тройника. Следующий вызов подключает один поток из бесконечного закрепления Tee к фильтру захвата MSDV. Этот поток передается на устройство. Последний вызов RenderStream создает раздел предварительного просмотра графа.

Если вы не хотите выполнять предварительный просмотр во время передачи, можно опустить бесконечное закрепление Тройник и просто подключить DV Mux к фильтру MSDV:

hr = pBuilder->RenderStream(0, 0, pDVMux, 0, pDV);

Цифровое видео в DirectShow