Источник мультимедиа 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> элементов. Атрибут start предоставляет время презентации в миллисекундах для этого подпись. Субтитры в этом примере предоставляются на двух языках, указанных тегами языка RFC-1766: "en-US" и "fr -FR". В подписях языки идентифицируются по именам классов; в данном случае "ENUSCC" и "FRFRCC".

Источник мультимедиа SAMI создает один поток мультимедиа для каждого языка. По умолчанию выбирается первый поток, а остальные потоки отменяются. Приложение может изменить выбор потока, вызвав IMFPresentationDescriptor::SelectStream и IMFPresentationDescriptor::D eselectStream. Каждый дескриптор потока содержит следующие атрибуты.

attribute Описание
MF_SD_LANGUAGE Тег языка, заданный атрибутом lang .
MF_SD_SAMI_LANGUAGE Имя языка, заданное атрибутом Name .

 

Каждый поток имеет следующий тип мультимедиа:

attribute Значение
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:

Список имен стилей также хранится в дескрипторе презентации в атрибуте MF_PD_SAMI_STYLELIST .

Источники и приемники мультимедиа

Поддерживаемые форматы мультимедиа в Media Foundation