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


Формат потока

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

И MSDV, и драйвер UVC могут выводить два формата DV: чередующееся аудио-видео или только видео. Чередующееся аудио-видео — это исходный формат устройства. Формат только для видео содержит те же данные, но примеры помечаются как не имеющие звуковых данных. Формат только для видео предназначен в основном для обеспечения совместимости с приложениями, которые используют Видео для Windows. Дополнительные сведения см. в разделе Type-1 и Type-2 DV AVI Files.

Драйвер MSDV

Драйвер MSDV имеет два выходных контакта. Первый выходной контакт отправляет данные с чередованием, а второй — только видео. Одновременно можно подключить только один выходной контакт. Чтобы выбрать формат, подключите соответствующий выходной контакт. Для поиска формата можно использовать интерфейс IAMStreamConfig на выходном контакте.

Драйвер UVC

В отличие от драйвера MSDV, драйвер UVC предоставляет оба формата из одного контакта. Формат по умолчанию — только видео. Чтобы выбрать формат, используйте интерфейс IAMStreamConfig на выходном контакте. Вызовите метод GetStreamCaps , чтобы перечислить типы мультимедиа в выходном контакте. Для каждого типа мультимедиа, если основной тип соответствует требуемому формату, вызовите Метод SetFormat и передайте этот тип мультимедиа.

Формат Основной тип
Чередующиеся аудио- и видео MEDIATYPE_Interleaved
Только видео MEDIATYPE_Video

 

Следующая функция задает формат на основе GUID основного типа.

HRESULT SetStreamFormat(IAMStreamConfig *pConfig, const GUID& majorType)
{
    if (pConfig == NULL)
    {
        return E_POINTER;
    }

    // Get the number of stream capabilities.
    int count = 0, size = 0;
    HRESULT hr = pConfig->GetNumberOfCapabilities(&count, &size);
    if (FAILED(hr))
    {
        return hr;
    }

    // Allocate memory for the stream capabilities structure.
    BYTE *pCaps = new BYTE[size];
    if (pCaps == NULL)
    {
        return E_OUTOFMEMORY;
    }
    
    // Enumerate the stream capabilities.
    bool bFoundType = false;
    for (int ix = 0; ix < count; ix++)
    {
        AM_MEDIA_TYPE *pmt;
        hr = pConfig->GetStreamCaps(ix, &pmt, pCaps);
        if (FAILED(hr))
        {
            break;
        }
        else if (pmt->majortype == majorType)
        {
            // This is the media type we want.
            bFoundType = true;
            hr = pConfig->SetFormat(pmt);
            DeleteMediaType(pmt);
            break;
        }
        DeleteMediaType(pmt);
    }
    delete [] pCaps;
    if (FAILED(hr))
    {
        return hr;
    }
    return bFoundType ? S_OK : E_FAIL;
}

Драйвер MSDV также поддерживает IAMStreamConfig, поэтому вы можете написать код, который подходит для обоих типов устройств.

Управление dv camcorder