Condividi tramite


Utilizzo delle stringhe di testo DVD

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation invece di DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

Alcuni dischi DVD, in particolare i dischi karaoke, potrebbero contenere un elenco di stringhe di testo per integrare il video o il contenuto audio. Queste stringhe di testo contengono metadati relativi al contenuto, ad esempio titoli di brani, nomi di artisti, informazioni sul genere e così via. Le stringhe di testo possono essere presenti in più lingue. Queste stringhe sono facoltative e molti dischi non li hanno.

Per recuperare le stringhe di testo da un DVD, usare l'interfaccia IInfo2 , esposta dallo strumento di navigazione DVD. Non è effettivamente necessario creare un grafico di riproduzione DVD per recuperare le stringhe di testo. È sufficiente creare lo strumento di navigazione DVD, impostare il volume DVD e quindi chiamare i metodi di stringa di testo pertinenti:

Metodo Descrizione
IDeviceInfo2::GetDEVICETextNumberOfLanguages Ottiene il numero di lingue per cui sono presenti stringhe di testo.
IDeviceInfo2::GetDEVICETextLanguageInfo Ottiene informazioni sulle stringhe di testo per una lingua.
IDeviceInfo2::GetDEVICETextStringAsUnicode Ottiene una stringa di testo per una lingua specificata, in base all'indice.
IDeviceInfo2::GetDEVICETextStringAsNative Ottiene una stringa di testo come matrice di byte non elaborata. Utilizzare questo metodo se la stringa di testo usa una codifica di caratteri non supportata da GetTEXTTextStringAsUnicode.

 

Ecco la procedura di base per ottenere stringhe di testo:

  1. Chiamare IDeviceInfo2::GetDEVICETextNumberOfLanguages per trovare il numero totale di lingue in cui vengono visualizzate le stringhe di testo. Se il numero è zero, significa che il DVD non ha stringhe di testo. (Questo è forse il caso più comune, in realtà.
  2. Se il numero di lingue è almeno uno, chiamare IDeviceInfo2::GetTEXTLanguageInfo per ottenere informazioni su ogni lingua. La lingua è specificata dall'indice. Il metodo restituisce il numero totale di stringhe di testo in tale lingua, l'identificatore delle impostazioni locali (LCID) per la lingua e la codifica dei caratteri (Unicode o altro). Le stringhe di testo DVD possono utilizzare diversi set di caratteri; sono elencati in DVD_TextCharSet'enumerazione .
  3. Per ottenere una stringa di testo, chiamare IDeviceInfo2::GetDEVICETextStringAsUnicode o IDeviceInfo2::GetDEVICETextStringAsNative. Il primo metodo restituisce una stringa di caratteri wide, ma non supporta ogni set di caratteri. Il secondo metodo restituisce una matrice di byte contenente i dati di testo non elaborati. Per entrambi i metodi, è possibile chiamare il metodo con un puntatore al buffer NULL per trovare le dimensioni della stringa e il tipo di testo. Allocare quindi un buffer e chiamare di nuovo il metodo per ottenere la stringa.

Ogni stringa di testo ha un codice identificatore associato, che indica il significato della stringa di testo. L'identificatore viene restituito come valore DVD_TextStringType . Esistono due categorie di identificatori: identificatori di struttura e identificatori di contenuto. Gli identificatori di struttura hanno codici numerici nell'intervallo 0x00-0x02F. Gli identificatori di contenuto hanno un intervallo di 0x30 e superiore. L'enumerazione DVD_TextStringType definisce un subset degli identificatori più comuni, ma i metodi IInfo2 possono restituire qualsiasi codice identificatore. Un identificatore di struttura descrive una parte logica del DVD, ad esempio volume, titolo o parte del titolo (PTT). Un identificatore di contenuto indica il significato di una determinata stringa di testo, ad esempio titolo del film, titolo del brano o genere.

Gli identificatori di struttura non hanno stringhe di testo associate. Quando un identificatore di struttura viene visualizzato nei dati della stringa di testo, segnala che le stringhe di testo seguenti si applicano a quella parte logica del DVD, fino all'identificatore di struttura successivo. La posizione degli identificatori di struttura all'interno dei dati di testo corrisponde alla gerarchia logica del volume DVD. Ad esempio, la prima occorrenza dell'identificatore DVD_Struct_Title (0x02) rappresenta il primo titolo nel volume e l'occorrenza successiva rappresenta il secondo titolo.

Nella tabella seguente viene illustrato come definire le stringhe di testo per un DVD con due titoli.

DVD_TextStringType Stringa di testo Descrizione
DVD_Struct_Volume (0x01) "" Identificatore della struttura per l'intero lato disco.
DVD_General_Name (0x30) "Volume DVD" Nome del volume DVD.
DVD_Struct_Title (0x02) "" Identificatore della struttura per il primo titolo.
DVD_General_Name (0x30) "Titolo 1" Nome del primo titolo.
DVD_Struct_Title (0x02) "" Identificatore della struttura per il secondo titolo.
DVD_General_Name (0x30) "Titolo 2" Nome del secondo titolo.

 

I metodi GetTEXTTextStringAsUnicode e GetTEXTStringAsNative gestiscono gli identificatori di struttura e gli identificatori di contenuto uguali. L'unica differenza è che per gli identificatori di struttura il buffer di testo associato è vuoto. Spetta all'applicazione tenere traccia della relazione tra le stringhe di testo e le parti logiche del DVD.

Nell'esempio seguente viene illustrato come ottenere stringhe di testo da un DVD. In questo esempio vengono ignorati alcuni dettagli necessari per un'applicazione reale. Ad esempio, ignora gli identificatori di struttura. L'esempio è destinato solo a mostrare la sequenza corretta di chiamate.

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

Per informazioni sulle stringhe di testo DVD, vedere il sito Web del forum DVD.

Il metodo CDeviceCore::GetText nell'applicazione DVDSample illustra i passaggi di base nell'enumerazione e nella visualizzazione di stringhe di testo DVD.

Applicazioni DVD