Источник мультимедиа SAMI
Синхронизированный обмен доступными носителями (SAMI) — это формат добавления подписей в цифровой носитель. Заголовки хранятся в отдельном текстовом файле с расширением SMI или Sami.
В Media Foundation файлы подписей SAMI поддерживаются с помощью источника мультимедиа SAMI. Используйте сопоставитель источника для создания экземпляра источника мультимедиа SAMI из URL-адреса или потока байтов. Media Foundation не предоставляет компонент, в котором отображаются заголовки SAMI. Приложение должно интерпретировать данные заголовка, полученные из источника мультимедиа SAMI.
Ниже показан пример файла SAMI.
<SAMI>
<HEAD>
<STYLE TYPE="text/css">
<!--
P {
font-family: Arial;
background: #000000;
text-align: center;
}
#standard {Name: Standard; color: #FFFFFF; font-size: 14pt; }
#hilite {Name: Youth; color: greenyellow; font-size: 18pt;}
.ENUSCC { Name: English; lang: EN-US-CC; }
.FRFRCC { Name: French; lang: fr-FR; }
-->
</STYLE>
</HEAD>
<BODY>
<SYNC Start="0">
<P Class="ENUSCC">The <I>first</I> caption.</P>
<P Class="FRFRCC">Un</P>
</SYNC>
<SYNC Start="3000">
<P Class="ENUSCC">The <I>second</I> caption.</P>
<P Class="FRFRCC">Deux</P>
</SYNC>
<SYNC Start="5000">
<P Class="ENUSCC">The <I>third</I> caption.</P>
<P Class="FRFRCC">Trois</P>
</SYNC>
</BODY>
</SAMI>
Элемент <STYLE>
содержит сведения о стиле. В этом примере содержится базовый стиль для элементов <P>
, а также два именованных стиля, "стандартный" и "hilite". Именованные стили используются для изменения базового стиля. Подписи помещаются в элементы <SYNC>
. Начальный атрибут предоставляет время презентации в миллисекундах для этого заголовка. Подписи в этом примере задаются на двух языках, указанных тегами языка RFC-1766, "en-US" и "fr -FR". В заголовках языки определяются их именами классов; в этом случае "ENUSCC" и "FRFRCC".
Источник мультимедиа SAMI создает один поток мультимедиа для каждого языка. По умолчанию выбирается первый поток, а остальные потоки удаляются. Приложение может изменить выбор потока, вызвав IMFPresentationDescriptor::SelectStream и IMFPresentationDescriptor::D eselectStream. Каждый дескриптор потока содержит следующие атрибуты.
Атрибут | Описание |
---|---|
MF_SD_LANGUAGE | Тег языка, заданный атрибутом lang . |
MF_SD_SAMI_LANGUAGE | Имя языка, заданное атрибутом Name . |
Каждый поток имеет следующий тип носителя:
Атрибут | Ценность |
---|---|
MF_MT_MAJOR_TYPE | MFMediaType_SAMI |
MF_MT_ALL_SAMPLES_INDEPENDENT | TRUE |
Источник SAMI предоставляет каждое заголовок в отдельном образце носителя. Пример метки времени и длительности является производным от элемента <SYNC>
. Буфер мультимедиа, содержащийся в примере, содержит заголовок как текст ASCII. Стиль подписи внедрен в заголовок как встроенный атрибут STYLE
. Например, учитывая предыдущий файл SAMI и используя поток английского языка со стилями по умолчанию, первый буфер мультимедиа будет содержать следующие данные. (Разрывы строк могут отличаться от показанного здесь.)
<P STYLE="
font-family: Arial;
background: #000000;
text-align: center;
Name: English; lang: EN-US-CC;
Name: Standard; color: #FFFFFF;
font-size: 14pt; ">The<I>first</I> caption.
Стили SAMI
Чтобы изменить текущий стиль, используйте интерфейс IMFSAMIStyle. Этот интерфейс получается путем вызова IMFGetService::GetService в источнике мультимедиа SAMI. (Если вы используете источник мультимедиа SAMI с сеансом мультимедиа, вызовите GetService на сеансе мультимедиа.) Идентификатор службы MF_SAMI_SERVICE.
В следующем примере задается текущий стиль SAMI, заданный индексом.
HRESULT SetSAMIStyleByIndex(IMFMediaSource *pSource, DWORD index)
{
IMFSAMIStyle *pSami = NULL;
DWORD cStyles;
PROPVARIANT varStyles;
HRESULT hr = MFGetService(pSource, MF_SAMI_SERVICE, IID_PPV_ARGS(&pSami));
if (FAILED(hr))
{
goto done;
}
hr = pSami->GetStyleCount(&cStyles);
if (FAILED(hr))
{
goto done;
}
if (index >= cStyles)
{
hr = E_INVALIDARG;
goto done;
}
hr = pSami->GetStyles(&varStyles);
if (FAILED(hr))
{
goto done;
}
hr = pSami->SetSelectedStyle(varStyles.calpwstr.pElems[index]);
done:
PropVariantClear(&varStyles);
SafeRelease(&pSami);
return hr;
}
В этом примере вызываются следующие методы в источнике мультимедиа SAMI:
- МВФSAMIStyle::GetStyleCount получает количество стилей.
- МВФSAMIStyle::GetStyles получает список имен стилей, хранящихся в PROPVARIANT.
- МВФSAMIStyle::SetSelectedStyle задает стиль по имени.
Список имен стилей также хранится в дескрипторе презентации в атрибуте MF_PD_SAMI_STYLELIST.
Связанные разделы