Megosztás a következőn keresztül:


DVD szöveges karakterláncok használata

[A laphoz társított funkció, DirectShowegy régi funkció. Az alábbiak váltották fel: MediaPlayer, IMFMediaEngineés Audio/Video Capture a Media Foundation. Ezek a funkciók Windows 10-hez és Windows 11-hez lettek optimalizálva. A Microsoft határozottan javasolja, hogy az új kód, amikor csak lehetséges, inkább a MediaPlayer-t, a IMFMediaEngine-t és a Audio/Video Capture módot használja a Media Foundation-ben, a DirectShowhelyett. A Microsoft javasolja, hogy az örökölt API-kat használó meglévő kódot át kell írni az új API-k használatára, ha lehetséges.]

Egyes DVD-lemezek, különösen a karaoke lemezek tartalmazhatnak szöveges sztringeket a videó- vagy hangtartalom kiegészítéséhez. Ezek a szöveges sztringek metaadatokat tartalmaznak a tartalomról, például dalcímeket, előadói neveket, műfaji információkat stb. A szöveges sztringek több nyelven is jelen lehetnek. Ezek a sztringek nem kötelezőek, és sok lemezen nem találhatók.

A szöveges sztringek DVD-ről való lekéréséhez használja az IDvdInfo2 felületet, amelyet a DVD-kezelő. A szövegek lekéréséhez valójában nem kell DVD-lejátszási gráfot készítenie. Egyszerűen létrehozhatja a DVD-kezelőt, beállíthatja a DVD-kötetet, majd meghívhatja a kapcsolódó szöveg-karakterlánc metódusokat.

Módszer Leírás
IDvdInfo2::GetDVDTextNumberOfLanguages Azoknak a nyelveknek a számát adja meg, amelyekhez szöveges sztringek tartoznak.
IDvdInfo2::GetDVDTextLanguageInfo Egy nyelv szöveges sztringjeivel kapcsolatos információkat kér le.
IDvdInfo2::GetDVDTextStringAsUnicode Egy adott nyelvhez tartozó szöveges sztringet kér le index alapján.
IDvdInfo2::GetDVDTextStringAsNative Lekéri a szöveges karakterláncot nyers bájttömbként. Ezt a módszert akkor használja, ha a szöveges sztring olyan karakterkódolást használ, amelyet GetDVDTextStringAsUnicodenem támogat.

 

A szöveges sztringek lekérésének alapművelete a következő:

  1. Hívja meg IDvdInfo2::GetDVDTextNumberOfLanguages a szövegsztringeket tartalmazó nyelvek teljes számának megkereséséhez. Ha a szám nulla, az azt jelenti, hogy a DVD-n nincsenek szöveges sztringek. (Ez talán a leggyakoribb eset, sőt.)
  2. Ha a nyelvek száma legalább egy, hívja IDvdInfo2::GetDVDTextLanguageInfo az egyes nyelvekre vonatkozó információk lekéréséhez. A nyelvet index határozza meg. A metódus az adott nyelv szöveges sztringjeinek teljes számát, a nyelv területi azonosítóját (LCID) és a karakterkódolást (Unicode vagy egyéb) adja vissza. A DVD-szöveges sztringek több különböző karakterkészletet is használhatnak; ezek DVD_TextCharSet Enumerálásilistában találhatók.
  3. Szöveges lánc lekéréséhez hívja meg IDvdInfo2::GetDVDTextStringAsUnicode vagy IDvdInfo2::GetDVDTextStringAsNative. Az első metódus egy széles karakterű sztringet ad vissza, de nem támogatja minden karakterkészletet. A második metódus egy bájttömböt ad vissza, amely a nyers szöveges adatokat tartalmazza. Mindkét metódus esetében meghívhatja a metódust egy NULL puffermutatóval a sztring és a szövegtípus méretének megkereséséhez. Ezután foglaljon le egy puffert, és hívja meg újra a metódust a sztring lekéréséhez.

Minden szöveges sztringhez tartozik egy azonosítókód, amely a szöveges sztring jelentését jelzi. Az azonosító DVD_TextStringType értékként lesz visszaadva. Az azonosítóknak két kategóriája van: struktúraazonosítók és tartalomazonosítók. A struktúraazonosítók numerikus kódokkal rendelkeznek a 0x00–0x02F tartományban. A tartalomazonosítók 0x30 és magasabb tartományokkal rendelkeznek. (A DVD_TextStringType enumerálás a leggyakoribb azonosítók egy részét határozza meg, de az IDvdInfo2 metódusok bármilyen azonosítókódot visszaadhatnak.) A struktúraazonosító a DVD logikai részét írja le, például a kötetet, a címet vagy a cím egy részét (PTT). A tartalomazonosító egy adott szöveges sztring jelentését jelzi, például a film címét, a dal címét vagy a műfajt.

A struktúraazonosítók nem rendelkeznek társított szöveges sztringekkel. Amikor egy struktúraazonosító megjelenik a szöveges sztringadatokban, az azt jelzi, hogy a következő szöveges sztringek a DVD adott logikai részére vonatkoznak, egészen a következő struktúraazonosítóig. A struktúraazonosítók helye a szöveges adatokban a DVD-kötet logikai hierarchiájának felel meg. A DVD_Struct_Title azonosító (0x02) első előfordulása például a kötet első címét, a következő előfordulás pedig a második címet jelöli.

Az alábbi táblázat bemutatja, hogyan definiálhatók a szöveges sztringek egy két címmel rendelkező DVD-n.

DVD_TextStringType Szöveges karakterlánc Leírás
DVD_Struct_Volume (0x01) "" A teljes lemezoldal struktúraazonosítója.
DVD_General_Name (0x30) DVD-kötet DVD-kötet neve.
DVD_Struct_Title (0x02) "" Az első cím struktúraazonosítója.
DVD_General_Name (0x30) "1. cím" Az első cím neve.
DVD_Szerkezet_Cím (0x02) "" A második cím struktúraazonosítója.
DVD_General_Name (0x30) "2. cím" A második cím neve.

 

A GetDVDTextStringAsUnicode és GetDVDTextStringAsNative metódusok ugyanúgy kezelik a struktúraazonosítókat és a tartalomazonosítókat. Az egyetlen különbség az, hogy a struktúraazonosítók esetében a társított szövegpuffer üres. Az alkalmazás feladata, hogy nyomon kövesse a szövegsztringek és a DVD logikai részei közötti kapcsolatot.

Az alábbi példa bemutatja, hogyan kérhet le szöveges sztringeket DVD-ről. Ez a példa figyelmen kívül hagy néhány olyan részletet, amelyet egy valós alkalmazás igényelne. (Például figyelmen kívül hagyja a struktúraazonosítókat.) A példa csak a hívások megfelelő sorozatának megjelenítésére szolgál.

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

A DVD szöveges elemekről további információt a DVD Fórum webhelyéntalál.

A CDvdCore::GetDvdText metódus a DVDSample alkalmazásban bemutatja a DVD szöveges sztringek számbavételének és megjelenítésének alapvető lépéseit.

DVD-alkalmazások