Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Essas funcionalidades foram otimizadas para Windows 10 e Windows 11. Microsoft recomenda fortemente que o novo código utilize MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation em vez de DirectShow, sempre que possível. A Microsoft sugere que o código existente que utiliza as APIs legadas seja reescrito para usar as novas APIs, se possível.]
Alguns DVDs, especialmente os de karaoke, podem conter uma lista de sequências de texto para complementar o conteúdo de vídeo ou áudio. Estas cadeias de texto contêm metadados sobre o conteúdo, como títulos de músicas, nomes de artistas, informações de género, entre outros. As cadeias de texto podem estar presentes em mais do que uma língua. Estas cordas são opcionais, e muitos discos não as têm.
Para recuperar cadeias de texto de um DVD, use a interface IDvdInfo2 , que é exposta pelo DVD Navigator. Na verdade, não precisa de construir um gráfico de reprodução de DVD para recuperar as cadeias de texto. Pode simplesmente criar o DVD Navigator, definir o volume do DVD e depois chamar os métodos de string de texto relevantes:
| Método | Descrição |
|---|---|
| IDvdInfo2::GetDVDTextNumberOfLanguages | Obtém o número de línguas para as quais existem strings de texto. |
| IDvdInfo2::GetDVDTextLanguageInfo | Obtém informações sobre as cadeias de texto para uma língua. |
| IDvdInfo2::GetDVDTextStringAsUnicode | Obtém uma string de texto para uma língua especificada, através de um índice. |
| IDvdInfo2::GetDVDTextStringAsNative | Recebe uma cadeia de texto como um array de bytes bruto. Use este método se a cadeia de texto usar uma codificação de caracteres não suportada pelo GetDVDTextStringAsUnicode. |
Aqui está o procedimento básico para obter cadeias de texto:
- Chame IDvdInfo2::GetDVDTextNumberOfLanguages para encontrar o número total de idiomas em que aparecem as cadeias de texto. Se o número for zero, significa que o DVD não tem sequências de texto. (Este é talvez o caso mais comum, na verdade.)
- Se o número de línguas for pelo menos uma, ligue para IDvdInfo2::GetDVDTextLanguageInfo para obter informações sobre cada língua. A linguagem é especificada por índice. O método devolve o número total de cadeias de texto nessa língua, o identificador local (LCID) para a língua e a codificação de caracteres (Unicode ou outra). As cadeias de texto de DVD podem usar vários conjuntos de caracteres diferentes, os quais estão listados na enumeração DVD_TextCharSet.
- Para obter uma cadeia de texto, chame IDvdInfo2::GetDVDTextStringAsUnicode ou IDvdInfo2::GetDVDTextStringAsNative. O primeiro método devolve uma cadeia de caracteres largos, mas não suporta todos os conjuntos de caracteres. O segundo método devolve um array de bytes contendo os dados de texto bruto. Para ambos os métodos, pode chamar o método com um ponteiro buffer NULL para encontrar o tamanho da string e o tipo de texto. Depois aloca um buffer e chama novamente o método para obter a cadeia.
Cada cadeia de texto tem um código identificador associado, que indica o significado da cadeia de texto. O identificador é devolvido como um valor DVD_TextStringType . Existem duas categorias de identificadores: identificadores de estrutura e identificadores de conteúdo. Os identificadores de estrutura têm códigos numéricos no intervalo 0x00–0x02F. Os identificadores de conteúdo têm um intervalo de 0x30 e superiores. (A enumeração DVD_TextStringType define um subconjunto dos identificadores mais comuns, mas os métodos IDvdInfo2 podem devolver qualquer código identificador.) Um identificador de estrutura descreve uma parte lógica do DVD, como volume, título ou parte do título (PTT). Um identificador de conteúdo indica o significado de uma determinada cadeia de texto, como título de filme, título de música ou género.
Os identificadores de estrutura não têm cadeias de texto associadas. Quando um identificador de estrutura aparece nos dados da cadeia de texto, sinaliza que as seguintes cadeias de texto se aplicam a essa parte lógica do DVD, até ao próximo identificador de estrutura. A posição dos identificadores de estrutura dentro dos dados de texto corresponde à hierarquia lógica do volume do DVD. Por exemplo, a primeira ocorrência do identificador de DVD_Struct_Title (0x02) representa o primeiro título do volume, e a ocorrência seguinte representa o segundo título.
A tabela seguinte mostra como as cadeias de texto podem ser definidas para um DVD com dois títulos.
| DVD_TextStringType | Cadeia de texto | Descrição |
|---|---|---|
| DVD_Struct_Volume (0x01) | "" | Identificador de estrutura do lado inteiro do disco. |
| DVD_General_Name (0x30) | "Volume DVD" | Nome do volume do DVD. |
| DVD_Struct_Title (0x02) | "" | Identificador de estrutura para o primeiro título. |
| DVD_General_Name (0x30) | "Título 1" | Nome do primeiro título. |
| DVD_Struct_Title (0x02) | "" | Identificador de estrutura para o segundo título. |
| DVD_General_Name (0x30) | "Título 2" | Nome do segundo título. |
Os métodos GetDVDTextStringAsUnicode e GetDVDTextStringAsNative tratam identificadores de estrutura e identificadores de conteúdo da mesma forma. A única diferença é que, para identificadores de estrutura, o buffer de texto associado está vazio. Cabe à aplicação acompanhar a relação entre as cadeias de texto e as partes lógicas do DVD.
O exemplo seguinte mostra como obter cadeias de texto de um DVD. Este exemplo ignora alguns detalhes que uma aplicação real exigiria. (Por exemplo, ignora identificadores de estrutura.) O exemplo destina-se apenas a mostrar a sequência correta de chamadas.
#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;
}
O método CDvdCore::GetDvdText na aplicação DVDSample demonstra os passos básicos para enumerar e exibir cadeias de texto do DVD.
Tópicos relacionados