Freigeben über


Arbeiten mit DVD-Textzeichenfolgen

[Bei dem dieser Seite zugeordneten Feature DirectShow handelt es sich um ein Legacyfeature. Es wurde durch MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation ersetzt. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code MediaPlayer verwendet wird, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die legacy-APIs verwendet, um die neuen APIs nach Möglichkeit zu verwenden, neu geschrieben werden.]

Einige DVDs, insbesondere Karaoke-DVDs, können eine Liste von Textzeilen enthalten, um den Video- oder Audioinhalt zu ergänzen. Diese Textzeichenfolgen enthalten Metadaten zum Inhalt, z. B. Songtitel, Künstlernamen, Genreinformationen usw. Textzeichenfolgen können in mehr als einer Sprache vorhanden sein. Diese Zeichenfolgen sind optional, und viele Discs haben sie nicht.

Um Textzeichenfolgen von einer DVD abzurufen, verwenden Sie die IDvdInfo2-Schnittstelle , die vom DVD Navigator verfügbar gemacht wird. Sie müssen kein DVD-Wiedergabediagramm erstellen, um die Textzeichenfolgen abzurufen. Sie können einfach den DVD-Navigator erstellen, das DVD-Volume festlegen und dann die relevanten Textzeichenfolgenmethoden aufrufen:

Methode Beschreibung
IDvdInfo2::GetDVDTextNumberOfLanguages Ruft die Anzahl der Sprachen ab, für die Textzeichenfolgen vorhanden sind.
IDvdInfo2::GetDVDTextLanguageInfo Ruft Informationen zu den Textzeichenfolgen für eine Sprache ab.
IDvdInfo2::GetDVDTextStringAsUnicode Ruft eine Textzeichenfolge für eine angegebene Sprache nach Index ab.
IDvdInfo2::GetDVDTextStringAsNative Ruft eine Textzeichenfolge als unformatiertes Bytearray ab. Verwenden Sie diese Methode, wenn die Textzeichenfolge eine Zeichencodierung verwendet, die von GetDVDTextStringAsUnicode nicht unterstützt wird.

 

Hier ist das grundlegende Verfahren zum Abrufen von Textzeichenfolgen:

  1. Rufen Sie IDvdInfo2::GetDVDTextNumberOfLanguages auf, um die Gesamtanzahl der Sprachen zu ermitteln, in denen die Textzeichenfolgen angezeigt werden. Wenn die Zahl null ist, bedeutet dies, dass die DVD keine Textzeichenfolgen enthält. (Dies ist vielleicht der häufigste Fall, in der Tat.)
  2. Wenn die Anzahl der Sprachen mindestens eins ist, rufen Sie IDvdInfo2::GetDVDTextLanguageInfo auf, um Informationen zu jeder Sprache abzurufen. Die Sprache wird durch Index angegeben. Die Methode gibt die Gesamtanzahl der Textzeichenfolgen in dieser Sprache, den Gebietsschemabezeichner (LCID) für die Sprache und die Zeichencodierung (Unicode oder andere) zurück. DVD-Textzeichenfolgen können verschiedene Zeichensätze verwenden; diese werden in DVD_TextCharSet Enumeration aufgeführt.
  3. Rufen Sie zum Abrufen einer Textzeichenfolge IDvdInfo2::GetDVDTextStringAsUnicode oder IDvdInfo2::GetDVDTextStringAsNative auf. Die erste Methode gibt eine breite Zeichenfolge zurück, unterstützt jedoch nicht jeden Zeichensatz. Die zweite Methode gibt ein Bytearray zurück, das die Rohtextdaten enthält. Für beide Methoden können Sie die Methode mit einem NULL-Pufferzeiger aufrufen, um die Größe der Zeichenfolge und den Texttyp zu ermitteln. Weisen Sie dann einen Puffer zu, und rufen Sie die Methode erneut auf, um die Zeichenfolge abzurufen.

Jede Textzeichenfolge weist einen zugeordneten Bezeichnercode auf, der die Bedeutung der Textzeichenfolge angibt. Der Bezeichner wird als DVD_TextStringType Wert zurückgegeben. Es gibt zwei Kategorien von Bezeichnern: Strukturbezeichner und Inhaltsbezeichner. Strukturbezeichner weisen numerische Codes im Bereich 0x00-0x02F auf. Inhaltsbezeichner weisen einen Bereich von 0x30 und höher auf. (Die DVD_TextStringType-Aufzählung definiert eine Teilmenge der am häufigsten verwendeten Bezeichner, aber die IDvdInfo2-Methoden können jeden Bezeichnercode zurückgeben.) Ein Strukturbezeichner beschreibt einen logischen Teil der DVD, z. B. Volume, Titel oder Teil des Titels (PTT). Ein Inhaltsbezeichner gibt die Bedeutung einer bestimmten Textzeichenfolge an, z. B. Filmtitel, Songtitel oder Genre.

Strukturbezeichner haben keine Zeichenfolgen zugeordnet. Wenn ein Strukturbezeichner in den Textzeichenfolgendaten angezeigt wird, signalisiert er, dass die folgenden Textzeichenfolgen für diesen logischen Teil der DVD bis zum nächsten Strukturbezeichner gelten. Die Position der Strukturbezeichner innerhalb der Textdaten entspricht der logischen Hierarchie des DVD-Volumes. Beispielsweise stellt das erste Vorkommen des DVD_Struct_Title-Bezeichners (0x02) den ersten Titel im Volume dar, und das nächste Vorkommen stellt den zweiten Titel dar.

In der folgenden Tabelle wird gezeigt, wie die Textzeichenfolgen für eine DVD mit zwei Titeln definiert werden können.

DVD_TextStringType Textzeichenfolge Beschreibung
DVD_Struct_Volume (0x01) "" Strukturbezeichner für die gesamte Discseite.
DVD_General_Name (0x30) DVD-Volumen DVD-Volumename.
DVD-Struktur-Titel (0x02) "" Strukturbezeichner für den ersten Titel.
DVD_Allgemeiner_Name (0x30) "Titel 1" Name des ersten Titels.
DVD_Struct_Title (0x02) "" Strukturbezeichner für den zweiten Titel.
DVD_General_Name (0x30) "Titel 2" Name des zweiten Titels.

 

Die Methoden GetDVDTextStringAsUnicode und GetDVDTextStringAsNative behandeln Strukturbezeichner und Inhaltsbezeichner gleich. Der einzige Unterschied besteht darin, dass der zugeordnete Textpuffer für Strukturbezeichner leer ist. Es liegt an der Anwendung, die Beziehung zwischen den Textzeichenfolgen und den logischen Teilen der DVD nachzuverfolgen.

Das folgende Beispiel zeigt, wie Textzeichenfolgen von einer DVD abgerufen werden. In diesem Beispiel werden einige Details ignoriert, die eine echte Anwendung erfordern würde. (Sie ignoriert z. B. Strukturbezeichner.) Das Beispiel soll nur die richtige Abfolge von Aufrufen anzeigen.

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

Die CDvdCore::GetDvdText-Methode in der DVDSample-Anwendung veranschaulicht die grundlegenden Schritte zum Aufzählen und Anzeigen von DVD-Textzeichenfolgen.

DVD-Anwendungen