Fonte de mídia SAMI

O SAMI (Intercâmbio de Mídia Acessível Sincronizado) é um formato para adicionar legendas à mídia digital. As legendas são armazenadas em um arquivo de texto separado com a extensão de nome de arquivo .smi ou .sami.

No Media Foundation, há suporte para os arquivos de legenda SAMI por meio da fonte de mídia SAMI. Use o Resolvedor de Origem para criar uma instância da fonte de mídia SAMI de uma URL ou fluxo de bytes. O Media Foundation não fornece um componente que exibe legendas SAMI. O aplicativo deve interpretar os dados legenda que recebe da fonte de mídia SAMI.

O exemplo a seguir mostra um arquivo SAMI de exemplo.

<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>

O <STYLE> elemento contém informações de estilo. Este exemplo contém um estilo base para <P> elementos, juntamente com dois estilos nomeados, "standard" e "hilite". Os estilos nomeados são usados para modificar o estilo base. As legendas são colocadas dentro <SYNC> dos elementos. O atributo start fornece o tempo de apresentação em milissegundos para esse legenda. As legendas neste exemplo são fornecidas em dois idiomas, especificados por suas marcas de idioma RFC-1766, "en-US" e "fr -FR". Dentro das legendas, os idiomas são identificados por seus nomes de classe; nesse caso, "ENUSCC" e "FRFRCC".

A fonte de mídia SAMI cria um fluxo de mídia para cada idioma. Por padrão, o primeiro fluxo é selecionado e os fluxos restantes são desmarcados. O aplicativo pode alterar a seleção de fluxo chamando IMFPresentationDescriptor::SelectStream e IMFPresentationDescriptor::D eselectStream. Cada descritor de fluxo contém os atributos a seguir.

Atributo Descrição
MF_SD_LANGUAGE Marca de idioma, conforme dado pelo lang atributo .
MF_SD_SAMI_LANGUAGE Nome do idioma, conforme fornecido pelo Name atributo .

 

Cada fluxo tem o seguinte tipo de mídia:

Atributo Valor
MF_MT_MAJOR_TYPE MFMediaType_SAMI
MF_MT_ALL_SAMPLES_INDEPENDENT TRUE

 

A fonte SAMI fornece cada legenda em um exemplo de mídia separado. O carimbo de data/hora de exemplo e a duração são derivados do <SYNC> elemento . O buffer de mídia contido no exemplo contém o legenda como texto ASCII. O estilo legenda é inserido no legenda como um atributo embutidoSTYLE. Por exemplo, considerando o arquivo SAMI anterior e usando o fluxo em inglês com os estilos padrão, o primeiro buffer de mídia conteria os dados a seguir. (As quebras de linha podem ser diferentes do que é mostrado aqui.)

<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.

Estilos SAMI

Para alterar o estilo atual, use a interface IMFSAMIStyle . Essa interface é obtida chamando IMFGetService::GetService na fonte de mídia SAMI. (Se você estiver usando a fonte de mídia SAMI com a Sessão de Mídia, chame GetService na Sessão de Mídia.) O identificador de serviço é MF_SAMI_SERVICE.

O exemplo a seguir define o estilo SAMI atual, especificado pelo índice.

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;
}

Este exemplo chama os seguintes métodos na fonte de mídia SAMI:

A lista de nomes de estilo também é armazenada no descritor de apresentação, no atributo MF_PD_SAMI_STYLELIST .

Fontes de mídia e coletores

Formatos de mídia compatíveis com o Media Foundation