Partager via


Utilisation des chaînes de texte DVD

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture in Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement que le nouveau code utilise MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation au lieu de DirectShow, si possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]

Certains disques DVD, en particulier les disques karaoké, peuvent contenir une liste de chaînes de texte pour compléter le contenu vidéo ou audio. Ces chaînes de texte contiennent des métadonnées sur le contenu, telles que des titres de chansons, des noms d’artistes, des informations de genre, etc. Les chaînes de texte peuvent être présentes dans plusieurs langues. Ces chaînes sont facultatives et de nombreux disques n’en ont pas.

Pour récupérer des chaînes de texte à partir d’un DVD, utilisez l’interface IDvdInfo2 , qui est exposée par le navigateur de DVD. Vous n’avez pas besoin de créer un graphique de lecture de DVD pour récupérer les chaînes de texte. Vous pouvez simplement créer le navigateur de DVD, définir le volume du DVD, puis appeler les méthodes de chaîne de texte appropriées :

Méthode Description
IDvdInfo2::GetDVDTextNumberOfLanguages Obtient le nombre de langues pour lesquelles il existe des chaînes de texte.
IDvdInfo2::GetDVDTextLanguageInfo Obtient des informations sur les chaînes de texte pour une langue.
IDvdInfo2::GetDVDTextStringAsUnicode Obtient une chaîne de texte pour une langue spécifiée, par index.
IDvdInfo2::GetDVDTextStringAsNative Obtient une chaîne de texte sous la forme d’un tableau d’octets brut. Utilisez cette méthode si la chaîne de texte utilise un encodage de caractères non pris en charge par GetDVDTextStringAsUnicode.

 

Voici la procédure de base pour obtenir des chaînes de texte :

  1. Appelez IDvdInfo2::GetDVDTextNumberOfLanguages pour trouver le nombre total de langues dans lesquelles les chaînes de texte apparaissent. Si le nombre est égal à zéro, cela signifie que le DVD n’a pas de chaînes de texte. (C’est peut-être le cas le plus courant, en fait.)
  2. Si le nombre de langues est au moins une, appelez IDvdInfo2::GetDVDTextLanguageInfo pour obtenir des informations sur chaque langue. La langue est spécifiée par index. La méthode retourne le nombre total de chaînes de texte dans cette langue, l’identificateur de paramètres régionaux (LCID) de la langue et l’encodage de caractères (Unicode ou autre). Les chaînes de texte de DVD peuvent utiliser plusieurs jeux de caractères différents ; ils sont répertoriés dans DVD_TextCharSet émentation.
  3. Pour obtenir une chaîne de texte, appelez IDvdInfo2::GetDVDTextStringAsUnicode ou IDvdInfo2::GetDVDTextStringAsNative. La première méthode retourne une chaîne à caractères larges, mais ne prend pas en charge tous les ensembles de caractères. La deuxième méthode retourne un tableau d’octets contenant les données de texte brut. Pour les deux méthodes, vous pouvez appeler la méthode avec un pointeur de mémoire tampon NULL pour rechercher la taille de la chaîne et le type de texte. Allouez ensuite une mémoire tampon et appelez à nouveau la méthode pour obtenir la chaîne.

Chaque chaîne de texte a un code d’identificateur associé, qui indique la signification de la chaîne de texte. L’identificateur est retourné en tant que valeur DVD_TextStringType . Il existe deux catégories d’identificateurs : les identificateurs de structure et les identificateurs de contenu. Les identificateurs de structure ont des codes numériques dans la plage 0x00-0x02F. Les identificateurs de contenu ont une plage de 0x30 et supérieure. ( L’énumération DVD_TextStringType définit un sous-ensemble des identificateurs les plus courants, mais les méthodes IDvdInfo2 peuvent retourner n’importe quel code d’identificateur.) Un identificateur de structure décrit une partie logique du DVD, comme le volume, le titre ou une partie de titre (PTT). Un identificateur de contenu indique la signification d’une chaîne de texte particulière, telle que le titre du film, le titre de la chanson ou le genre.

Les identificateurs de structure n’ont pas de chaînes de texte associées. Lorsqu’un identificateur de structure apparaît dans les données de chaîne de texte, il indique que les chaînes de texte suivantes s’appliquent à cette partie logique du DVD, jusqu’à l’identificateur de structure suivant. La position des identificateurs de structure dans les données de texte correspond à la hiérarchie logique du volume dvd. Par exemple, la première occurrence de l’identificateur de DVD_Struct_Title (0x02) représente le premier titre du volume, et l’occurrence suivante représente le deuxième titre.

Le tableau suivant montre comment les chaînes de texte peuvent être définies pour un DVD avec deux titres.

DVD_TextStringType Chaîne de texte Description
DVD_Struct_Volume (0x01) "" Identificateur de structure pour l’ensemble du côté disque.
DVD_General_Name (0x30) « Volume DVD » Nom du volume DVD.
DVD_Struct_Title (0x02) "" Identificateur de structure pour le premier titre.
DVD_General_Name (0x30) « Titre 1 » Nom du premier titre.
DVD_Struct_Title (0x02) "" Identificateur de structure pour le deuxième titre.
DVD_General_Name (0x30) « Titre 2 » Nom du deuxième titre.

 

Les méthodes GetDVDTextStringAsUnicode et GetDVDTextStringAsNative traitent les identificateurs de structure et les identificateurs de contenu de la même façon. La seule différence est que pour les identificateurs de structure, la mémoire tampon de texte associée est vide. Il incombe à l’application de suivre la relation entre les chaînes de texte et les parties logiques du DVD.

L’exemple suivant montre comment obtenir des chaînes de texte à partir d’un DVD. Cet exemple ignore certains détails requis par une application réelle. (Par exemple, il ignore les identificateurs de structure.) L’exemple est uniquement destiné à afficher la séquence correcte d’appels.

#define CHECK_HR(hr) if (FAILED(hr)) { goto done; }
#define SAFE_ARRAY_DELETE(x) { if (x != NULL) { delete [] x; x = NULL; } }

HRESULT GetDVDTextStrings()
{
    HRESULT hr = S_OK;
    ULONG cLangs = 0;       // Number of languages.
    ULONG cStrings = 0;     // Number of text strings.
    ULONG cchBuffer = 0;    // Buffer size.
    ULONG cchActual = 0;    // Actual string size.

    LCID lcid;              // Locale identifier.
    DVD_TextCharSet     characterSet;
    DVD_TextStringType  stringType;

    WCHAR *pszBuffer = NULL;

    CComPtr<IBaseFilter> pFilter;
    CComPtr<IDvdInfo2> pInfo;
    CComPtr<IDvdControl2> pControl;

    // Set up the DVD Navigator.
    CHECK_HR(hr = pFilter.CoCreateInstance(CLSID_DVDNavigator));
    CHECK_HR(hr = pFilter.QueryInterface(&pInfo));
    CHECK_HR(hr = pFilter.QueryInterface(&pControl));
    CHECK_HR(hr = pControl->SetDVDDirectory(NULL));

    // Find the number of text-string languages.
    CHECK_HR(hr = pInfo->GetDVDTextNumberOfLanguages(&cLangs));
    if (cLangs == 0)
    {
        return S_FALSE; // No text strings.
    }

    // Get information about the 0'th language.
    CHECK_HR(hr = pInfo->GetDVDTextLanguageInfo(
        0, &cStrings, &lcid, &characterSet));

    // First check if this character set is compatible with the 
    // GetDVDTextStringAsUnicode method.

    if (characterSet == DVD_CharSet_Unicode || 
        characterSet == DVD_CharSet_ISO646)
    {
        // Loop through all of the strings.
        for (ULONG i = 0; i < cStrings; i++)
        {
            // Get the i'th string for the 0'th language.

            // Find the required buffer size and the string type.
            CHECK_HR(hr = pInfo->GetDVDTextStringAsUnicode(
                0,            // Language index.
                i,            // String index.
                NULL,         // Pass NULL pointer to get the buffer size.
                0,            // Size of the buffer we are passing in.
                &cchBuffer,   // Receives the required buffer size.
                &stringType   // Receives the identifier code.
                ));

            // Skip structure identifiers (0x00 - 0x2F).
            if ((cchBuffer > 0) && (stringType >= 0x30))
            {
                // Allocate a buffer and get the text string.
                pszBuffer = new WCHAR[cchBuffer];
                if (pszBuffer == NULL)
                {
                    CHECK_HR(hr = E_OUTOFMEMORY);
                }

                CHECK_HR(hr = pInfo->GetDVDTextStringAsUnicode(
                    0, i, pszBuffer, cchBuffer, &cchActual, &stringType));

                // TODO: Display the text string.

                SAFE_ARRAY_DELETE(pszBuffer);
            }
        }
    }

done:
    SAFE_ARRAY_DELETE(pszBuffer);
    return hr;
}

Pour plus d’informations sur les chaînes de texte de DVD, consultez le site web du Forum des DVD.

La méthode CDvdCore::GetDvdText dans l’application DVDSample illustre les étapes de base de l’énumération et de l’affichage des chaînes de texte de DVD.

DVD Applications