Bekerja dengan String Teks DVD

[Fitur yang terkait dengan halaman ini, DirectShow, adalah fitur warisan. Ini telah digantikan oleh MediaPlayer, IMFMediaEngine, dan Tangkapan Audio/Video di Media Foundation. Fitur-fitur tersebut telah dioptimalkan untuk Windows 10 dan Windows 11. Microsoft sangat menyarankan agar kode baru menggunakan MediaPlayer, IMFMediaEngine dan Audio/Video Capture di Media Foundation alih-alih DirectShow, jika memungkinkan. Microsoft menyarankan agar kode yang ada yang menggunakan API warisan ditulis ulang untuk menggunakan API baru jika memungkinkan.]

Beberapa disk DVD, terutama cakram karaoke, mungkin berisi daftar string teks untuk melengkapi konten video atau audio. String teks ini berisi metadata tentang konten, seperti judul lagu, nama artis, informasi genre, dan sebagainya. String teks dapat ada dalam lebih dari satu bahasa. String ini bersifat opsional, dan banyak disk tidak memilikinya.

Untuk mengambil string teks dari DVD, gunakan antarmuka IDvdInfo2 , yang diekspos oleh DVD Navigator. Anda sebenarnya tidak perlu membuat grafik pemutaran DVD untuk mengambil string teks. Anda cukup membuat DVD Navigator, mengatur volume DVD, lalu memanggil metode string teks yang relevan:

Metode Deskripsi
IDvdInfo2::GetDVDTextNumberOfLanguages Mendapatkan jumlah bahasa yang ada string teksnya.
IDvdInfo2::GetDVDTextLanguageInfo Mendapatkan informasi tentang string teks untuk satu bahasa.
IDvdInfo2::GetDVDTextStringAsUnicode Mendapatkan string teks untuk bahasa tertentu, menurut indeks.
IDvdInfo2::GetDVDTextStringAsNative Mendapatkan string teks sebagai array byte mentah. Gunakan metode ini jika string teks menggunakan pengodean karakter yang tidak didukung oleh GetDVDTextStringAsUnicode.

 

Berikut adalah prosedur dasar untuk mendapatkan string teks:

  1. Panggil IDvdInfo2::GetDVDTextNumberOfLanguages untuk menemukan jumlah total bahasa tempat string teks muncul. Jika angkanya nol, artinya DVD tidak memiliki string teks apa pun. (Ini mungkin kasus yang paling umum, pada kenyataannya.)
  2. Jika jumlah bahasa setidaknya satu, hubungi IDvdInfo2::GetDVDTextLanguageInfo untuk mendapatkan informasi tentang setiap bahasa. Bahasa ditentukan oleh indeks. Metode mengembalikan jumlah total string teks dalam bahasa tersebut, pengidentifikasi lokal (LCID) untuk bahasa, dan pengodean karakter (Unicode atau lainnya). String teks DVD dapat menggunakan beberapa set karakter yang berbeda; ini tercantum dalam Enumerasi DVD_TextCharSet.
  3. Untuk mendapatkan string teks, panggil IDvdInfo2::GetDVDTextStringAsUnicode atau IDvdInfo2::GetDVDTextStringAsNative. Metode pertama mengembalikan string karakter lebar, tetapi tidak mendukung setiap set karakter. Metode kedua mengembalikan array byte yang berisi data teks mentah. Untuk kedua metode, Anda dapat memanggil metode dengan penunjuk buffer NULL untuk menemukan ukuran string dan jenis teks. Kemudian alokasikan buffer dan panggil metode lagi untuk mendapatkan string.

Setiap string teks memiliki kode pengidentifikasi terkait, yang menunjukkan arti string teks. Pengidentifikasi dikembalikan sebagai nilai DVD_TextStringType . Ada dua kategori pengidentifikasi: pengidentifikasi struktur dan pengidentifikasi konten. Pengidentifikasi struktur memiliki kode numerik dalam rentang 0x00–0x02F. Pengidentifikasi konten memiliki rentang 0x30 dan yang lebih tinggi. ( Enumerasi DVD_TextStringType mendefinisikan subset pengidentifikasi yang paling umum, tetapi metode IDvdInfo2 dapat mengembalikan kode pengidentifikasi apa pun.) Pengidentifikasi struktur menjelaskan bagian logis DVD, seperti volume, judul, atau bagian dari judul (PTT). Pengidentifikasi konten menunjukkan arti string teks tertentu, seperti judul film, judul lagu, atau genre.

Pengidentifikasi struktur tidak memiliki string teks terkait. Saat pengidentifikasi struktur muncul dalam data string teks, pengidentifikasi teks menandakan bahwa string teks berikut berlaku untuk bagian logis DVD tersebut, hingga pengidentifikasi struktur berikutnya. Posisi pengidentifikasi struktur dalam data teks sesuai dengan hierarki logis volume DVD. Misalnya, kemunculan pertama pengidentifikasi DVD_Struct_Title (0x02) mewakili judul pertama dalam volume, dan kemunculan berikutnya mewakili judul kedua.

Tabel berikut ini memperlihatkan bagaimana string teks mungkin ditentukan untuk DVD dengan dua judul.

DVD_TextStringType String teks Deskripsi
DVD_Struct_Volume (0x01) "" Pengidentifikasi struktur untuk seluruh sisi disk.
DVD_General_Name (0x30) "Volume DVD" Nama volume DVD.
DVD_Struct_Title (0x02) "" Pengidentifikasi struktur untuk judul pertama.
DVD_General_Name (0x30) "Judul 1" Nama judul pertama.
DVD_Struct_Title (0x02) "" Pengidentifikasi struktur untuk judul kedua.
DVD_General_Name (0x30) "Judul 2" Nama judul kedua.

 

Metode GetDVDTextStringAsUnicode dan GetDVDTextStringAsNative memperlakukan pengidentifikasi struktur dan pengidentifikasi konten yang sama. Satu-satunya perbedaan adalah bahwa untuk pengidentifikasi struktur, buffer teks terkait kosong. Terserah aplikasi untuk melacak hubungan antara string teks dan bagian logis DVD.

Contoh berikut menunjukkan cara mendapatkan string teks dari DVD. Contoh ini mengabaikan beberapa detail yang diperlukan aplikasi nyata. (Misalnya, ini mengabaikan pengidentifikasi struktur.) Contohnya hanya dimaksudkan untuk menunjukkan urutan panggilan yang benar.

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

Untuk informasi tentang string teks DVD, lihat situs Web Forum DVD.

Metode CDvdCore::GetDvdText dalam aplikasi DVDSample menunjukkan langkah-langkah dasar dalam menghitung dan menampilkan string teks DVD.

Aplikasi DVD