Дескрипторы презентации
Презентация — это набор связанных потоков мультимедиа, которые используют общее время презентации. Например, презентация может состоять из аудио- и видеопотоков из фильма. Дескриптор презентации — это объект, содержащий описание конкретной презентации. Дескрипторы презентации используются для настройки источников мультимедиа и некоторых приемников мультимедиа.
Каждый дескриптор презентации содержит список из одного или нескольких дескрипторов потока. Они описывают потоки в презентации. Потоки можно выбрать или отменить. Только выбранные потоки создают данные. Выбранные потоки не активны и не создают никаких данных. Каждый дескриптор потока имеет обработчик типа мультимедиа, который используется для изменения типа мультимедиа потока или получения текущего типа мультимедиа потока. (Дополнительные сведения о типах мультимедиа см. в разделе Типы мультимедиа.)
В следующей таблице показаны основные интерфейсы, предоставляемые каждым из этих объектов.
Объект | Интерфейс |
---|---|
Дескриптор презентации | IMFPresentationDescriptor |
Дескриптор потока | IMFStreamDescriptor |
Обработчик типов мультимедиа | IMFMediaTypeHandler |
Презентации источника мультимедиа
Каждый источник мультимедиа предоставляет дескриптор презентации, описывающий конфигурацию по умолчанию для источника. В конфигурации по умолчанию выбирается по крайней мере один поток, и каждый выбранный поток имеет тип мультимедиа. Чтобы получить дескриптор презентации, вызовите IMFMediaSource::CreatePresentationDescriptor. Метод возвращает указатель IMFPresentationDescriptor .
Вы можете изменить дескриптор представления источника, чтобы выбрать другой набор потоков. Не изменяйте дескриптор презентации, если источник мультимедиа не остановлен. Изменения применяются при вызове IMFMediaSource::Start для запуска источника.
Чтобы получить количество потоков, вызовите IMFPresentationDescriptor::GetStreamDescriptorCount. Чтобы получить дескриптор потока для потока, вызовите МЕТОД IMFPresentationDescriptor::GetStreamDescriptorByIndex и передайте индекс потока. Потоки индексируются с нуля. Метод GetStreamDescriptorByIndex возвращает указатель IMFStreamDescriptor . Он также возвращает логический флаг, указывающий, выбран ли поток. Если выбран поток, источник мультимедиа создает данные для этого потока. В противном случае источник не создает никаких данных для этого потока. Чтобы выбрать поток, вызовите IMFPresentationDescriptor::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);
Обработчики типов мультимедиа
Чтобы изменить тип мультимедиа потока или получить текущий тип мультимедиа потока, используйте обработчик типа мультимедиа дескриптора потока. Вызовите IMFStreamDescriptor::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);
Связанные темы