Дескрипторы презентации
презентации — это набор связанных потоков мультимедиа, которые используют общее время презентации. Например, презентация может состоять из аудио- и видеопотоков из фильма. Дескриптор презентации — это объект, содержащий описание конкретной презентации. Дескрипторы презентаций используются для настройки источников мультимедиа и некоторых приемников мультимедиа.
Каждый дескриптор презентации содержит список одного или нескольких дескрипторов потоков . Они описывают потоки в презентации. Потоки можно выбрать или отменить выбор. Только выбранные потоки создают данные. Неактивные потоки не являются активными и не создают никаких данных. Каждый дескриптор потока имеет обработчик типа мультимедиа , который используется для изменения типа носителя потока или получения текущего типа носителя потока. (Дополнительные сведения о типах носителей см. в разделе Типы носителей.)
В следующей таблице показаны основные интерфейсы, предоставляемые каждым из этих объектов.
Объект | Интерфейс |
---|---|
Дескриптор презентации | МВФPresentationDescriptor |
Дескриптор потока | МВФStreamDescriptor |
Обработчик типов мультимедиа | МВФMediaTypeHandler |
Презентации источника мультимедиа
Каждый источник мультимедиа предоставляет дескриптор презентации, описывающий конфигурацию по умолчанию для источника. В конфигурации по умолчанию выбран по крайней мере один поток, и каждый выбранный поток имеет тип носителя. Чтобы получить дескриптор презентации, вызовите IMFMediaSource::CreatePresentationDescriptor. Метод возвращает указатель МВФPresentationDescriptor.
Вы можете изменить дескриптор презентации источника, чтобы выбрать другой набор потоков. Не изменяйте дескриптор презентации, если источник мультимедиа не остановлен. Изменения применяются при вызове IMFMediaSource::Start для запуска источника.
Чтобы получить количество потоков, вызовите МВФPresentationDescriptor::GetStreamDescriptorCount. Чтобы получить дескриптор потока для потока, вызовите МВФPresentationDescriptor::GetStreamDescriptorByIndex и передайте индекс потока. Потоки индексируются от нуля. Метод getStreamDescriptorByIndex возвращает указатель IMFStreamDescriptor. Он также возвращает логический флаг, указывающий, выбран ли поток. Если выбран поток, источник мультимедиа создает данные для этого потока. В противном случае источник не создает никаких данных для этого потока. Чтобы выбрать поток, вызовите МВФPresentationDescriptor::SelectStream с индексом потока. Чтобы отменить выбор потока, вызовите IMFPresentationDescriptor::D eselectStream.
В следующем коде показано, как получить дескриптор презентации из источника мультимедиа и перечислить потоки.
HRESULT hr = S_OK;
DWORD cStreams = 0;
BOOL fSelected = FALSE;
IMFPresentationDescriptor *pPresentation = NULL;
IMFStreamDescriptor *pStreamDesc = NULL;
hr = pSource->CreatePresentationDescriptor(&pPresentation);
if (SUCCEEDED(hr))
{
hr = pPresentation->GetStreamDescriptorCount(&cStreams);
}
if (SUCCEEDED(hr))
{
for (DWORD iStream = 0; iStream < cStreams; iStream++)
{
hr = pPresentation->GetStreamDescriptorByIndex(
iStream, &fSelected, &pStreamDesc);
if (FAILED(hr))
{
break;
}
/* Use the stream descriptor. (Not shown.) */
SAFE_RELEASE(pStreamDesc);
}
}
SAFE_RELEASE(pPresentation);
SAFE_RELEASE(pStreamDesc);
Обработчики типов мультимедиа
Чтобы изменить тип носителя потока или получить текущий тип носителя потока, используйте обработчик типов мультимедиа дескриптора потока. Вызовите МВФStreamDescriptor::GetMediaTypeHandler, чтобы получить обработчик типов мультимедиа. Этот метод возвращает указатель IMFMediaTypeHandler.
Если вы просто хотите знать, какой тип данных находится в потоке, например аудио или видео, вызовите IMFMediaTypeHandler::GetMajorType. Этот метод возвращает GUID для основного типа мультимедиа. Например, приложение воспроизведения обычно подключает аудиопоток к отрисовщику звука и видеопотоку к отрисовщику видео. Если для создания топологии используется сеанс мультимедиа или загрузчик топологии, guid основного типа может быть единственным нужным форматом.
Если приложению требуется более подробная информация о текущем формате, вызовите IMFMediaTypeHandler::GetCurrentMediaType. Этот метод возвращает указатель на интерфейс IMFMediaType типа носителя. Используйте этот интерфейс для получения сведений о формате.
Обработчик типов мультимедиа также содержит список поддерживаемых типов носителей для потока. Чтобы получить размер списка, вызовите IMFMediaTypeHandler::GetMediaTypeCount. Чтобы получить тип мультимедиа из списка, вызовите IMFMediaTypeHandler::GetMediaTypeByIndex с индексом типа мультимедиа. Типы носителей возвращаются в приблизительном порядке предпочтения. Например, для аудиоформатов более высокие показатели выборки предпочтительнее более низких частот выборки. Тем не менее, нет окончательного правила, которое управляет упорядочиванием, поэтому вы должны рассматривать его просто как руководство.
Список поддерживаемых типов может содержать не все возможные типы носителей, поддерживаемые потоком. Чтобы проверить, поддерживается ли конкретный тип мультимедиа, вызовите IMFMediaTypeHandler::IsMediaTypeSupported. Чтобы задать тип носителя, вызовите IMFMediaTypeHandler::SetCurrentMediaType. Если метод выполнен успешно, поток будет содержать данные, соответствующие указанному формату. Метод SetCurrentMediaType не изменяет список предпочтительных типов.
В следующем коде показано, как получить обработчик типов мультимедиа, перечислить предпочитаемые типы носителей и задать тип носителя. В этом примере предполагается, что у приложения есть некоторый алгоритм, а не показанный здесь, для выбора типа носителя. Особенности будут зависеть от приложения.
HRESULT hr = S_OK;
DWORD cTypes = 0;
BOOL bTypeOK = FALSE;
IMFMediaTypeHandler *pHandler = NULL;
IMFMediaType *pMediaType = NULL;
hr = pStreamDesc->GetMediaTypeHandler(&pHandler);
if (SUCCEEDED(hr))
{
hr = pHandler->GetMediaTypeCount(&cTypes);
}
if (SUCCEEDED(hr))
{
for (DWORD iType = 0; iType < cTypes; iType++)
{
hr = pHandler->GetMediaTypeByIndex(iType, &pMediaType);
if (FAILED(hr))
{
break;
}
/* Examine the media type. (Not shown.) */
/* If this media type is acceptable, set the media type. */
if (bTypeOK)
{
hr = pHandler->SetCurrentMediaType(pMediaType);
break;
}
SAFE_RELEASE(pMediaType);
}
}
SAFE_RELEASE(pMediaType);
SAFE_RELEASE(pHandler);
Связанные разделы