Arbeiten mit DVD-Textzeichenfolgen

[Das dieser Seite zugeordnete Feature DirectShow ist 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 nach Möglichkeit MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet. Microsoft schlägt vor, vorhandenen Code, der die Legacy-APIs verwendet, um nach Möglichkeit die neuen APIs zu verwenden.]

Einige DVD-Discs, insbesondere Karaoke-Discs, enthalten möglicherweise eine Liste von Textzeichenfolgen, 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 mehreren Sprachen vorhanden sein. Diese Zeichenfolgen sind optional, und viele Datenträger verfügen nicht über sie.

Um Textzeichenfolgen von einer DVD abzurufen, verwenden Sie die IDvdInfo2-Schnittstelle , die vom DVD-Navigator verfügbar gemacht wird. Sie müssen eigentlich 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 Gesamtzahl der Sprachen zu ermitteln, in denen die Textzeichenfolgen angezeigt werden. Wenn die Zahl 0 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 eine ist, rufen Sie IDvdInfo2::GetDVDTextLanguageInfo auf, um Informationen zu den einzelnen Sprachen zu erhalten. Die Sprache wird durch den Index angegeben. Die Methode gibt die Gesamtzahl der Textzeichenfolgen in dieser Sprache, den Gebietsschemabezeichner (LCID) für die Sprache und die Zeichencodierung (Unicode oder andere) zurück. DVD-Textzeichenfolgen können mehrere unterschiedliche Zeichensätze verwenden. diese sind in DVD_TextCharSet Enumeration aufgeführt.
  3. Um eine Textzeichenfolge abzurufen, rufen Sie IDvdInfo2::GetDVDTextStringAsUnicode oder IDvdInfo2::GetDVDTextStringAsNative auf. Die erste Methode gibt eine Breitzeichenzeichenfolge zurück, unterstützt aber nicht jeden Zeichensatz. Die zweite Methode gibt ein Bytearray zurück, das die Rohtextdaten enthält. Bei beiden Methoden können Sie die -Methode mit einem NULL-Pufferzeiger aufrufen, um die Größe der Zeichenfolge und den Texttyp zu ermitteln. Ordnen Sie dann einen Puffer zu, und rufen Sie die Methode erneut auf, um die Zeichenfolge abzurufen.

Jede Textzeichenfolge verfügt über einen zugeordneten Bezeichnercode, 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 verfügen über numerische Codes im Bereich 0x00–0x02F. Inhaltsbezeichner verfügen über einen Bereich von 0x30 und höher. (Die DVD_TextStringType-Enumeration definiert eine Teilmenge der gängigsten 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, Titel des Titels oder Genre.

Strukturbezeichner verfügen nicht über zugeordnete Textzeichenfolgen. Wenn ein Strukturbezeichner in den Textzeichenfolgendaten angezeigt wird, signalisiert er, dass die folgenden Textzeichenfolgen bis zum nächsten Strukturbezeichner auf diesen logischen Teil der DVD angewendet werden. 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.

Die folgende Tabelle zeigt, 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 Datenträgerseite.
DVD_General_Name (0x30) "DVD-Volume" Name des DVD-Volumes.
DVD_Struct_Title (0x02) "" Strukturbezeichner für den ersten Titel.
DVD_General_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 bei Strukturbezeichnern der zugeordnete Textpuffer 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 benötigen würde. (Beispielsweise werden Strukturbezeichner ignoriert.) Das Beispiel soll nur die richtige Reihenfolge der Aufrufe 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;
}

Informationen zu DVD-Textzeichenfolgen finden Sie auf der Website des DVD-Forums.

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

DVD-Anwendungen