Criando um perfil ASF
Este tópico descreve como criar como perfil ASF no Microsoft Media Foundation.
- Criar um novo perfil
- Obter o perfil do objeto ContentInfo do ASF
- Obter o perfil de um descritor de apresentação
- Tópicos relacionados
Criar um novo perfil
Para criar um perfil ASF vazio, chame a função MFCreateASFProfile . Essa função retorna um ponteiro para a interface IMFASFProfile . O aplicativo pode usar essa interface para adicionar fluxos ao perfil e configurar cada um dos fluxos. Para obter mais informações, consulte Criando e configurando fluxos ASF.
Opcionalmente, o aplicativo pode adicionar objetos de exclusão mútua a dois ou mais fluxos. Consulte Usando exclusão mútua para fluxos ASF.
Obter o perfil do objeto ContentInfo do ASF
Um aplicativo pode obter o perfil ASF de um arquivo ASF existente do Objeto ContentInfo do ASF. O perfil já está configurado e contém configurações para todos os fluxos no arquivo.
Inicialize o objeto ContentInfo analisando o objeto de cabeçalho ASF do arquivo. Isso é feito por meio do método IMFASFContentInfo::P arseHeader . Depois que todos os Objetos de Cabeçalho forem lidos e a biblioteca ASF for preenchida, o perfil desse arquivo será gerado. O aplicativo pode obter um ponteiro para esse perfil inicializado chamando IMFASFContentInfo::GetProfile.
Obter o perfil de um descritor de apresentação
Você pode obter o objeto de perfil de um arquivo ASF existente do descritor de apresentação para o arquivo ou do objeto ContentInfo do ASF . Nesse caso, o perfil já está configurado e contém configurações para todos os fluxos no arquivo. Isso pode ser útil se você quiser modificar um perfil ASF existente. Por exemplo, talvez você queira recodificar um arquivo de Vídeo do Windows Media a uma taxa de bits mais baixa.
Para obter o perfil do descritor de apresentação, chame MFCreateASFProfileFromPresentationDescriptor. Essa função analisa o descritor de apresentação e preenche um perfil ASF com informações sobre o arquivo de mídia. A função retorna um ponteiro para a interface IMFASFProfile. Em seguida, você pode usar essa interface para modificar o perfil.
Para obter o descritor de apresentação, chame um dos seguintes métodos:
- Na fonte de mídia DO ASF, chame IMFMediaSource::CreatePresentationDescriptor.
- No objeto ContentInfo do ASF , chame IMFASFContentInfo::GeneratePresentationDescriptor. Antes de chamar esse método, verifique se o objeto ContentInfo foi inicializado para leitura. Para obter mais informações, consulte "Inicializando o objeto ContentInfo de um arquivo ASF existente" na leitura do objeto de cabeçalho ASF de um arquivo existente. No entanto, se você já tiver um objeto ContentInfo inicializado, poderá obter o perfil diretamente dele. Isso é descrito em "Obtendo o perfil do objeto ContentInfo" mais adiante neste tópico.
O exemplo a seguir mostra como criar um perfil de um descritor de apresentação. A função cria uma fonte de mídia para o arquivo, obtém o descritor de apresentação da fonte de mídia e cria um perfil. Este exemplo pressupõe que pszFileName especifique a URL de um arquivo ASF.
HRESULT GetASFProfile(PCWSTR pszFileName, IMFASFProfile** ppProfile)
{
*ppProfile = NULL;
IMFSourceResolver* pResolver = NULL;
IUnknown* pSourceUnk = NULL;
IMFMediaSource* pSource = NULL;
IMFPresentationDescriptor* pPD = NULL;
// Create the source resolver.
HRESULT hr = MFCreateSourceResolver(&pResolver);
// Use the source resolver to create the media source.
if (SUCCEEDED(hr))
{
MF_OBJECT_TYPE ObjectType;
hr = pResolver->CreateObjectFromURL(
pszFileName,
MF_RESOLUTION_MEDIASOURCE,
NULL,
&ObjectType,
&pSourceUnk
);
}
// Get the IMFMediaSource interface from the media source.
if (SUCCEEDED(hr))
{
hr = pSourceUnk->QueryInterface(IID_PPV_ARGS(&pSource));
}
// Get the presentation descriptor.
if (SUCCEEDED(hr))
{
hr = pSource->CreatePresentationDescriptor(&pPD);
}
// Get the profile from the presentation descriptor.
if (SUCCEEDED(hr))
{
hr = MFCreateASFProfileFromPresentationDescriptor(pPD, ppProfile);
}
SafeRelease(&pResolver);
SafeRelease(&pSourceUnk);
SafeRelease(&pSource);
SafeRelease(&pPD);
return hr;
}
Este exemplo usa SafeRelease para liberar ponteiros de interface.
Tópicos relacionados