Перечисление входных форматов
[Функция, связанная с этой страницей, Windows Media Format 11 SDK, является устаревшей функцией. Он был заменен читателем источника и писателем приемника. Source Reader и Sink Writer оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать новый код средства чтения исходного кода и записи приемников вместо пакета SDK для Windows Media 11, когда это возможно. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие API, будет перезаписан для использования новых API, если это возможно.]
Каждый из кодеков Windows Media принимает один или несколько типов входных носителей для сжатия. Пакет SDK для формата Windows Media позволяет вводить более широкий спектр форматов, чем поддерживаемые кодеками. Пакет SDK выполняет это путем предварительной обработки преобразований входных данных при необходимости, таких как изменение размера видеокадров или изменение размера звука. В любом случае необходимо убедиться, что входные форматы для файлов, которые вы записываете, соответствуют данным, которые вы отправляете в модуль записи. Каждый кодек имеет формат входного носителя по умолчанию, заданный в средстве записи при загрузке профиля. Вы можете проверить формат ввода по умолчанию, вызвав IWMWriter::GetInputProps.
Видеокодеки поддерживают следующие форматы: IYUV, I420, YV12, YUY2, UYVY, YVY, YVYU, YVU9, RGB 32, RGB 24, RGB 565, RGB 555 и RGB 8. Аудиокодеки поддерживают звук PCM.
Чтобы перечислить входные форматы, поддерживаемые кодеком, выполните следующие действия:
- Создайте объект для записи и задайте профиль для использования. Дополнительные сведения о настройке профилей в программе Writer см. в разделе Использование профилей с Writer.
- Определите входной номер, для которого необходимо проверить форматы. Дополнительные сведения об определении входных чисел см. в разделе Для определения входных данных по числу.
- Получение общего количества форматов ввода, поддерживаемых требуемыми входными данными, путем вызова IWMWriter::GetInputFormatCount.
- Прокрутите все поддерживаемые форматы входных данных, выполнив следующие действия для каждого из них.
- Получите интерфейс IWMInputMediaProps для входного формата, вызвав IWMWriter::GetInputFormat.
- Получите структуру WM_MEDIA_TYPE для входного формата. Вызовите IWMMediaProps::GetMediaType, передав NULL для параметра pType, чтобы получить размер структуры. Затем выделите память для хранения структуры и вызовите GetMediaType еще раз, чтобы получить структуру. IWMInputMediaProps наследуется от IWMMediaProps, чтобы можно было выполнять вызовы GetMediaType из экземпляра IWMInputMediaProp s, полученного на предыдущем шаге.
- Формат, описанный в структуре WM_MEDIA_TYPE, содержит все необходимые сведения о входном формате. Базовый формат носителя определяется WM_MEDIA_TYPE.подтипом. Для видеопотоков pbFormat указывает на динамически выделенную структуру WMVIDEOINFOHEADER, которая содержит дополнительные сведения о потоке, включая размер прямоугольника. Размер входных кадров не требуется точно совпадать с размером, поддерживаемым кодеком. Если они не совпадают, компоненты времени выполнения пакета SDK во многих случаях автоматически изменят размер входных видеокадров до того, что кодек может принять.
Следующий пример кода находит входной формат подтипа, переданный в качестве параметра. Дополнительные сведения об использовании этого кода см. в разделе Использование примеров кода.
HRESULT FindInputFormat(IWMWriter* pWriter,
DWORD dwInput,
GUID guidSubType,
IWMInputMediaProps** ppProps)
{
DWORD cFormats = 0;
DWORD cbSize = 0;
WM_MEDIA_TYPE* pType = NULL;
IWMInputMediaProps* pProps = NULL;
// Set the ppProps parameter to point to NULL. This will
// be used to check the results of the function later.
*ppProps = NULL;
// Find the number of formats supported by this input.
HRESULT hr = pWriter->GetInputFormatCount(dwInput, &cFormats);
if (FAILED(hr))
{
goto Exit;
}
// Loop through all of the supported formats.
for (DWORD formatIndex = 0; formatIndex < cFormats; formatIndex++)
{
// Get the input media properties for the input format.
hr = pWriter->GetInputFormat(dwInput, formatIndex, &pProps);
if (FAILED(hr))
{
goto Exit;
}
// Get the size of the media type structure.
hr = pProps->GetMediaType(NULL, &cbSize);
if (FAILED(hr))
{
goto Exit;
}
// Allocate memory for the media type structure.
pType = (WM_MEDIA_TYPE*) new (std::nothrow) BYTE[cbSize];
if (pType == NULL)
{
hr = E_OUTOFMEMORY;
goto Exit;
}
// Get the media type structure.
hr = pProps->GetMediaType(pType, &cbSize);
if (FAILED(hr))
{
goto Exit;
}
if(pType->subtype == guidSubType)
{
*ppProps = pProps;
(*ppProps)->AddRef();
goto Exit;
}
// Clean up for next iteration.
delete [] pType;
pType = NULL;
SAFE_RELEASE(pProps);
} // End for formatIndex.
// If execution made it to this point, no matching format was found.
hr = NS_E_INVALID_INPUT_FORMAT;
Exit:
delete [] pType;
SAFE_RELEASE(pProps);
return hr;
}
Связанные разделы