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ő:
- 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.)
- 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.
- 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.
Kapcsolódó témakörök