Поделиться через


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

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

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

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

Фильтры в этом графе включают:

  • Разделитель AVI анализирует файл AVI. Для DV-файла типа 1 выходной контакт предоставляет примеры dv с чередованием.
  • Фильтр Бесконечное закрепление тройника разделяет чередующийся DV на поток передачи и поток предварительного просмотра. Оба потока содержат одинаковые данные с чередованием. (На этом графике используется бесконечный тройник, а не смарт-тройник, так как нет никакой опасности удаления кадров при чтении из файла, как и при динамическом захвате.)
  • Разделитель DV разделяет чередующийся поток на видеопоток DV, который декодируется декодером dv Video Decoder, и аудиопоток. Оба потока отрисовываются для предварительного просмотра.

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

ICaptureGraphBuilder2 *pBuilder;  // Capture graph builder.
IBaseFilter           *pDV;       // DV capture filter (MSDV)

// Initialize pDV (not shown). 
// Create and initialize the Capture Graph Builder (not shown).

// 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");

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

// Add the AVI Splitter filter to the graph.
IBaseFilter *pAviSplit;
hr = CoCreateInstance(CLSID_AviSplitter, 0, CLSCTX_INPROC_SERVER
    IID_IBaseFilter, reinterpret_cast<void**>)(&pAviSplit));
hr = pGraph->AddFilter(pAviSplit, L"AVI Splitter");

// Connect the file source to the AVI Splitter.
hr = pBuilder->RenderStream(0, 0, pFileSource, 0, pAviSplit);
if (FAILED(hr))
{
    // This is not an AVI file. 
}

// Connect the file source to the Infinite Pin Tee.
hr = pBuilder->RenderStream(0, &MEDIATYPE_Interleaved, pAviSplit, 0, pTee);
if (FAILED(hr))
{
    // This is not a type-1 DV file.
}

// Render one stream from the Infinite Pin Tee to MSDV, for transmit.
hr = pBuilder->RenderStream(0, 0, pTee, 0, pDV);

// Render another stream from the Infinite Pin Tee for preview.
hr = pBuilder->RenderStream(0, 0, pTee, 0, 0);
  1. Вызовите метод IGraphBuilder::AddSourceFilter , чтобы добавить исходный фильтр в граф фильтра.
  2. Создайте разделитель AVI и бесконечное закрепление тройника и добавьте их в граф.
  3. Вызовите ICaptureGraphBuilder2::RenderStream , чтобы подключить фильтр источника к разделитеру AVI. Указание MEDIATYPE_Interleaved, чтобы убедиться, что метод завершается сбоем, если исходный файл не является DV-файлом типа 1. В этом случае можно вернуться и попытаться создать граф передачи типа 2.
  4. Снова вызовите RenderStream , чтобы перенаправлять поток с чередованием из разделителя AVI в бесконечное закрепление.
  5. Вызовите RenderStream в третий раз, чтобы направить один поток из бесконечного закрепления tee в фильтр MSDV для передачи на устройство.
  6. Вызовите RenderStream в последний раз, чтобы создать раздел предварительного просмотра графа.

Если вы не хотите использовать предварительную версию, просто подключите источник файлов к фильтру MSDV:

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

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