Para enumerar formatos de entrada
[A funcionalidade associada a esta página, Windows Media Format 11 SDK, é uma funcionalidade herdada. Foi substituído por Source Reader e Sink Writer. Source Reader e Sink Writer foram otimizados para o Windows 10 e o Windows 11. A Microsoft recomenda vivamente que o novo código utilize do Leitor de Origem e do Gravador de Separadores em vez de SDK do Windows Media Format 11, sempre que possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]
Cada um dos codecs do Windows Media aceita um ou mais tipos de mídia de entrada para compactação. O SDK do Windows Media Format permite que você insira uma variedade maior de formatos do que os suportados pelos codecs. O SDK faz isso executando transformações de pré-processamento nas entradas quando necessário, como redimensionamento de quadros de vídeo ou nova amostragem de áudio. Em qualquer caso, deve garantir que os formatos de entrada para os ficheiros que escreve correspondam aos dados que envia para o escritor. Cada codec tem um formato de mídia de entrada padrão que é definido no gravador quando o perfil é carregado. Você pode examinar o formato de entrada padrão chamando IWMWriter::GetInputProps.
Os codecs de vídeo suportam os seguintes formatos: IYUV, I420, YV12, YUY2, UYVY, YVYU, YVU9, RGB 32, RGB 24, RGB 565, RGB 555 e RGB 8. Os codecs de áudio suportam áudio PCM.
Para enumerar os formatos de entrada suportados por um codec, execute as seguintes etapas:
- Crie um objeto de escrita e defina um perfil a usar. Para obter mais informações sobre como proceder com perfis no escritor, consulte Usar perfis com o escritor.
- Identifique o número de entrada para o qual você deseja verificar os formatos. Para obter mais informações sobre como identificar números de entrada, consulte para identificar entradas por número.
- Recupere o número total de formatos de entrada suportados pela entrada desejada chamando IWMWriter::GetInputFormatCount.
- Percorra todos os formatos de entrada suportados, executando as seguintes etapas para cada um.
- Recupere o interface de IWMInputMediaProps para o formato de entrada chamando IWMWriter::GetInputFormat.
- Recupere a estrutura WM_MEDIA_TYPE para o formato de entrada. Invoque IWMMediaProps::GetMediaType, passando NULL para o parâmetro pType para obter o tamanho da estrutura. Em seguida, aloque memória para manter a estrutura e chame GetMediaType novamente para obter a estrutura. IWMInputMediaProps herda de IWMMediaProps, para que você possa fazer as chamadas para GetMediaType da instância de IWMInputMediaProps recuperada na etapa anterior.
- O formato descrito na estrutura WM_MEDIA_TYPE contém todas as informações pertinentes sobre o formato de entrada. O formato básico da mídia é identificado por WM_MEDIA_TYPE.subtype. Para fluxos de vídeo, o membro pbFormat aponta para uma estrutura WMVIDEOINFOHEADER alocada dinamicamente, que contém mais detalhes sobre o fluxo de vídeo, incluindo o tamanho do retângulo. O tamanho dos quadros de entrada não é necessário para corresponder exatamente a um tamanho suportado pelo codec. Se eles não corresponderem, os componentes de tempo de execução do SDK, em muitos casos, redimensionarão automaticamente os quadros de vídeo de entrada para algo que o codec possa aceitar.
O código de exemplo a seguir localiza o formato de entrada do subtipo passado como um parâmetro. Para obter mais informações sobre como usar esse código, consulte Usando os exemplos de código.
HRESULT FindInputFormat(IWMWriter* pWriter,
DWORD dwInput,
GUID guidSubType,
IWMInputMediaProps** ppProps)
{
DWORD cFormats = 0;
DWORD cbSize = 0;
WM_MEDIA_TYPE* pType = NULL;
IWMInputMediaProps* pProps = NULL;
// Set the ppProps parameter to point to NULL. This will
// be used to check the results of the function later.
*ppProps = NULL;
// Find the number of formats supported by this input.
HRESULT hr = pWriter->GetInputFormatCount(dwInput, &cFormats);
if (FAILED(hr))
{
goto Exit;
}
// Loop through all of the supported formats.
for (DWORD formatIndex = 0; formatIndex < cFormats; formatIndex++)
{
// Get the input media properties for the input format.
hr = pWriter->GetInputFormat(dwInput, formatIndex, &pProps);
if (FAILED(hr))
{
goto Exit;
}
// Get the size of the media type structure.
hr = pProps->GetMediaType(NULL, &cbSize);
if (FAILED(hr))
{
goto Exit;
}
// Allocate memory for the media type structure.
pType = (WM_MEDIA_TYPE*) new (std::nothrow) BYTE[cbSize];
if (pType == NULL)
{
hr = E_OUTOFMEMORY;
goto Exit;
}
// Get the media type structure.
hr = pProps->GetMediaType(pType, &cbSize);
if (FAILED(hr))
{
goto Exit;
}
if(pType->subtype == guidSubType)
{
*ppProps = pProps;
(*ppProps)->AddRef();
goto Exit;
}
// Clean up for next iteration.
delete [] pType;
pType = NULL;
SAFE_RELEASE(pProps);
} // End for formatIndex.
// If execution made it to this point, no matching format was found.
hr = NS_E_INVALID_INPUT_FORMAT;
Exit:
delete [] pType;
SAFE_RELEASE(pProps);
return hr;
}
Tópicos relacionados