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:
- IMFSAMIStyle::GetStyleCount obtém o número de estilos.
- IMFSAMIStyle::GetStyles obtém uma lista dos nomes de estilo, armazenados em um PROPVARIANT.
- IMFSAMIStyle::SetSelectedStyle define um estilo por nome.
A lista de nomes de estilo também é armazenada no descritor de apresentação, no atributo MF_PD_SAMI_STYLELIST .
Tópicos relacionados