Configurando perfis e outras propriedades de arquivo (QASF)
Os itens a seguir descrevem como executar várias tarefas relacionadas à criação de arquivos ASF.
Criando um perfil (QASF)
Para criar um perfil personalizado, use o SDK de Formato de Mídia do Windows diretamente para criar um objeto do gerenciador de perfil usando a função WMCreateProfileManager . Em seguida, crie o perfil e passe-o para o Gravador ASF do WM usando o método IConfigASFWriter::ConfigureFilterUsingProfile . Essa é a única maneira de configurar o filtro com um perfil que usa os codecs windows media audio e video 9 series. Os perfis do sistema para versões anteriores desses codecs podem ser adicionados usando o método IConfigASFWriter::ConfigureFilterUsingProfileGuid .
Adicionando metadados (QASF)
Para adicionar metadados a um arquivo, chame QueryInterface da interface IBaseFilter no Gravador ASF do WM para recuperar a interface IWMHeaderInfo . Depois que o filtro receber um perfil, use os métodos de interface IWMHeaderInfo para gravar os metadados.
Indexando um arquivo (QASF)
O Gravador ASF do WM cria arquivos indexados temporalmente por padrão. Para criar um arquivo indexado por quadro, use o método IConfigAsfWriter::SetIndexMode para desabilitar toda a indexação e, em seguida, crie o arquivo. Quando for concluído, use o SDK de Formato de Mídia do Windows diretamente para criar um índice baseado em quadros para o arquivo.
Executando a codificação de Two-Pass (QASF)
Há suporte para codificação de duas passões somente em codecs do Windows Media da versão 8 e posterior. Coloque o Gravador ASF do WM no modo de pré-processamento chamando IConfigAsfWriter2::SetParam e especificando AM_CONFIGASFWRITER_PARAM_MULTIPASS no parâmetro dwParam e TRUE no parâmetro dwParam1 .
Em seguida, execute o grafo de filtro. Quando todas as passagens de pré-processamento forem feitas (normalmente apenas uma passagem de pré-processamento será executada), o aplicativo receberá um evento EC_PREPROCESS_COMPLETE do filtro. Quando esse evento for recebido, use IMediaSeeking::SetPositions para redefinir o ponteiro de fluxo de volta para o início e execute o grafo de filtro novamente. Após a última passagem (normalmente a segunda passagem), o aplicativo receberá um evento EC_COMPLETE para significar que o processo de codificação está concluído. Se uma passagem de pré-processamento for cancelada antes que o evento EC_PREPROCESS_COMPLETE seja recebido, chame IConfigAsfWriter2::ResetMultiPassState para redefinir o filtro antes de tentar outra execução de pré-processamento.
Só é necessário chamar IConfigAsfWriter::SetParam(AM_CONFIGASFWRITER_PARAM_MULTIPASS, FALSE) se você quiser colocar o filtro fora do modo de pré-processamento completamente.
Importante
É responsabilidade do aplicativo habilitar o modo de pré-processamento com base no perfil que será usado para codificação. Alguns perfis exigem codificação de duas passões; se você tentar codificar um arquivo com esse perfil e não definir AM_CONFIGASFWRITER_PARAM_MULTIPASS como TRUE, um erro EC_USERABORT resultará. Para obter mais informações sobre como determinar se um determinado perfil requer codificação de duas passões, consulte Usando Two-Pass Codificação ou Gravando fluxos de taxa de bits variáveis.
Obtendo e definindo propriedades de buffer em tempo de execução (QASF)
Em alguns cenários, por exemplo, se você quiser forçar a inserção de quadro-chave ao gravar um arquivo, um aplicativo pode precisar obter ou definir informações sobre um buffer do Windows Media em tempo de execução. Os filtros Leitor do WM ASF e Gravador asF do WM dão suporte a um mecanismo de retorno de chamada que permite que um aplicativo acesse a interface INSSBuffer3 em cada buffer de mídia individual durante a leitura de arquivo ou gravação de arquivo. Os aplicativos podem usar essa interface para designar exemplos específicos como quadros-chave ou pontos limpos para definir códigos de tempo SMPTE, especificar configurações de entrelaçamento ou adicionar qualquer tipo de dados privados a um fluxo.
Use a interface IAMWMBufferPass para registrar retornos de chamada do pino que está tratando o fluxo de vídeo. Quando o pin chamar o método IAMWMBufferPassCallback::Notify , examine os carimbos de data/hora no buffer e, se apropriado, chame INSSBuffer3::SetProperty para definir a propriedade WM_SampleExtensionGUID_OutputCleanPoint no buffer como TRUE.
Suporte a pixels não quadrados (QASF)
O Gravador ASF do WM se conecta a um filtro de upstream, como o Decodificador DV, que gera informações de taxa de proporção de pixel. O Gravador ASF do WM escreverá essas informações como extensões de unidade de dados para cada exemplo no arquivo.
Quando o Leitor do ASF do WM encontrar informações de proporção de pixel no cabeçalho do arquivo ou em extensões de unidade de dados para os exemplos, ele oferecerá um tipo de mídia VIDEOINFOHEADER2 como uma primeira opção em seu pino de saída. Os membros dwPictAspectRatioX e dwPictAspectRatioY da estrutura, que descrevem a taxa de proporção do retângulo de vídeo, serão ajustados corretamente para considerar a taxa de proporção de pixel.
Mantendo formato entrelaçado
Se você capturar um vídeo entrelaçado de uma televisão ou uma câmera DV, convém preservar o vídeo original como campos independentes se você espera que o arquivo codificado seja reproduzido em uma televisão ou em outro dispositivo de exibição entrelaçado. (Monitores de computador são dispositivos de verificação progressivos.) Se você desinterlacear um vídeo e, em seguida, reintercalá-lo para reprodução em uma televisão, alguma perda de dados será incorrida. Em um arquivo ASF, as informações de interlacagem são armazenadas como extensões de unidade de dados que o aplicativo aplica a cada exemplo usando o método IAMWMBufferPassCallback descrito anteriormente. Para codificar um arquivo que preserva as configurações de entrelaçamento originais, siga estas etapas:
- Implemente uma classe que dê suporte a IAMWMBufferPassCallback e escreva uma função Notify que define os sinalizadores de entrelaçamento para cada exemplo. Essa função será chamada pelo Gravador ASF do WM antes de processar cada exemplo.
// Set to WM_CT_TOP_FIELD_FIRST if that is your format.
BYTE flag = WM_CT_INTERLACED | WM_CT_BOTTOM_FIELD_FIRST;
HRESULT hr = pNSSBuffer3->SetProperty(WM_SampleExtensionGUID_ContentType, (void*) &flag, WM_SampleExtension_ContentType_Size);
- Defina as extensões de unidade de dados no perfil antes de passar o perfil para o filtro.
hr = pWMStreamConfig2->AddDataUnitExtension( WM_SampleExtensionGUID_ContentType, WM_SampleExtension_ContentType_Size, NULL, 0 );
- Depois de configurar o filtro com o perfil, obtenha a interface IWMWriterAdvanced2 do Gravador ASF do WM e chame o método SetInputSettings .
// Must do this first.
hr = pConfigAsfWriter2->ConfigureFilterUsingProfile(pProfile);
CComPtr<IServiceProvider> pProvider;
CComPtr<IWMWriterAdvanced2> pWMWA2;
hr = pConfigAsfWriter2->QueryInterface( __uuidof(IServiceProvider),
(void**)&pProvider);
if (SUCCEEDED(hr))
{
hr = pProvider->QueryService(IID_IWMWriterAdvanced2,
IID_IWMWriterAdvanced2,
(void**)&pWMWA2);
}
BOOL pValue = TRUE;
// Set the first parameter to your actual input number.
hr = pWMWA2->SetInputSetting(0, g_wszInterlacedCoding,
WMT_TYPE_BOOL, (BYTE*) &pValue, sizeof(WMT_TYPE_BOOL));