Source multimédia SAMI
L’échange de média accessible synchronisé (SAMI) est un format permettant d’ajouter des légendes à des supports numériques. Les légendes sont stockées dans un fichier texte distinct avec l’extension de nom de fichier .smi ou .sami.
Dans Media Foundation, les fichiers de légende SAMI sont pris en charge par le biais de la source multimédia SAMI. Utilisez le programme de résolution de source pour créer une instance de la source multimédia SAMI à partir d’une URL ou d’un flux d’octets. Media Foundation ne fournit pas de composant qui affiche les légendes SAMI. L’application doit interpréter les données de légende qu’elle reçoit de la source multimédia SAMI.
Voici un exemple de fichier 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>
L’élément <STYLE>
contient des informations de style. Cet exemple contient un style de base pour <P>
éléments, ainsi que deux styles nommés, « standard » et « hilite ». Les styles nommés sont utilisés pour modifier le style de base. Les légendes sont placées dans <SYNC>
éléments. L’attribut de début donne le temps de présentation en millisecondes pour cette légende. Les légendes de cet exemple sont fournies dans deux langues, spécifiées par leurs balises de langue RFC-1766, «en-US» et « fr -FR ». Dans les légendes, les langues sont identifiées par leurs noms de classe ; dans ce cas, « ENUSCC » et « FRFRCC ».
La source multimédia SAMI crée un flux multimédia pour chaque langue. Par défaut, le premier flux est sélectionné et les flux restants sont désélectionnés. L’application peut modifier la sélection de flux en appelant IMFPresentationDescriptor ::SelectStream et IMFPresentationDescriptor ::D eselectStream. Chaque descripteur de flux contient les attributs suivants.
Attribut | Description |
---|---|
MF_SD_LANGUAGE | Balise de langue, comme indiqué par l’attribut lang . |
MF_SD_SAMI_LANGUAGE | Nom de la langue, comme indiqué par l’attribut Name . |
Chaque flux a le type de média suivant :
Attribut | Valeur |
---|---|
MF_MT_MAJOR_TYPE | MFMediaType_SAMI |
MF_MT_ALL_SAMPLES_INDEPENDENT | TRUE |
La source SAMI remet chaque légende dans un exemple de média distinct. L’exemple d’horodatage et de durée est dérivé de l’élément <SYNC>
. La mémoire tampon multimédia contenue dans l’exemple contient la légende en tant que texte ASCII. Le style de légende est incorporé dans la légende sous la forme d’un attribut STYLE
inline. Par exemple, étant donné le fichier SAMI précédent et en utilisant le flux de langue anglaise avec les styles par défaut, la première mémoire tampon multimédia contient les données suivantes. (Les sauts de ligne peuvent différer de ce qui est illustré ici.)
<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 Styles
Pour modifier le style actuel, utilisez l’interface IMFSAMIStyle. Cette interface est obtenue en appelant IMFGetService ::GetService sur la source multimédia SAMI. (Si vous utilisez la source multimédia SAMI avec la session multimédia, appelez GetService sur la session multimédia.) L’identificateur de service est MF_SAMI_SERVICE.
L’exemple suivant définit le style SAMI actuel, spécifié par l’index.
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;
}
Cet exemple appelle les méthodes suivantes sur la source multimédia SAMI :
- IMFSAMIStyle ::GetStyleCount obtient le nombre de styles.
- IMFSAMIStyle ::GetStyles obtient une liste des noms de style, stockés dans un PROPVARIANT.
- IMFSAMIStyle ::SetSelectedStyle définit un style par nom.
La liste des noms de style est également stockée sur le descripteur de présentation, dans l’attribut MF__SAMI_STYLELIST.
Rubriques connexes