Compartilhar via


Configurar perfis e outras propriedades de arquivo ASF

[O recurso associado a esta página, DirectShow, é um recurso herdado. Ele foi substituído por MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo na Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo no Media Foundation em vez de DirectShow, quando 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.]

Os itens a seguir descrevem como executar várias tarefas relacionadas à criação de arquivos ASF. Algumas das interfaces mencionadas neste tópico estão documentadas na documentação do SDK de Formato de Mídia do Windows.

Criando um perfil

Os perfis ASF são discutidos detalhadamente no SDK de Formato de Mídia do Windows; Essencialmente, eles descrevem atributos de um arquivo de Formato de Mídia do Windows, como taxa de bits, número e tipo de fluxos e qualidade de compactação. O filtro usa o perfil para determinar que tipo de arquivo de Formato de Mídia do Windows gravar, quantos pinos de entrada ele deve configurar e quais tipos de mídia eles podem aceitar.

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 .

Você pode redefinir o perfil enquanto os pinos de entrada do filtro estiverem conectados, desde que o novo perfil não exija nenhum pino de entrada adicional. Por exemplo, se você alterar o perfil de um perfil somente áudio de entrada para um perfil de áudio e vídeo de duas entradas, apenas o pino de áudio será reconectado e nenhum novo pin será criado para o fluxo de vídeo.

Adicionando metadados

Para adicionar metadados a um arquivo, consulte o filtro Gravador ASF do WM para a interface IWMHeaderInfo . Depois que o filtro receber um perfil, use os métodos de interface IWMHeaderInfo para gravar os metadados.

Indexando um arquivo

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.

Codificação Two-Pass

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 definir o parâmetro AM_CONFIGASFWRITER_PARAM_MULTIPASS como 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 de EC_USERABORT resultará. Para obter mais informações, consulte a documentação do SDK de Formato de Mídia do Windows.

 

Obtendo e definindo propriedades de buffer em tempo de execução

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, 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. O pin chamará o método IAMWMBufferPassCallback::Notify para cada buffer.

Pixels não quadrados

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 de 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 formato 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:

  1. 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 = S_OK;
    
    hr = pNSSBuffer3->SetProperty(
        WM_SampleExtensionGUID_ContentType, 
        (void*) &flag, 
        WM_SampleExtension_ContentType_Size
        );         
    
  2. 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 
        );
    
  3. 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));
    
    

Criando arquivos ASF no DirectShow