Criando o objeto Multiplexer

O multiplexador ASF é um objeto de camada WMContainer que funciona com o Objeto de Dados ASF e fornece a um aplicativo a capacidade de gerar pacotes de dados ASF para fluxos de mídia.

O objeto multiplexer expõe a interface IMFASFMultiplexer . Para criar o multiplexador, chame MFCreateASFMultiplexer. Essa função retorna um ponteiro para um objeto vazio. Se o aplicativo estiver gravando um novo arquivo ASF, o aplicativo deverá inicializar o multiplexador com um objeto ContentInfo. Para fazer isso, chame IMFASFMultiplexer::Initialize. O objeto ContentInfo especificado representa o objeto de cabeçalho ASF do novo arquivo. Para obter informações sobre como criar e inicializar o objeto ContentInfo para um novo arquivo, consulte Inicializando o objeto ContentInfo de um novo arquivo ASF.

O método Initialize analisa o objeto ContentInfo para coletar informações de configuração de fluxo, como o número de fluxos, o tamanho do pacote e o pré-registro. Opcionalmente, o multiplexador também pode precisar de parâmetros de bucket com vazamento e as unidades de extensão de conteúdo. Essas informações são necessárias para gerar pacotes de dados que correspondam aos requisitos definidos no Objeto de Cabeçalho ASF. O método Initialize define o multiplexador com base no tipo de mídia e nas definições de configuração dos fluxos. Por exemplo, se um fluxo estiver configurado para ter extensões de conteúdo (consulte Criando e configurando fluxos ASF) e, em seguida, o multiplexador será configurado para adicionar esses valores aos pacotes de dados gerados.

O método Initialize também obtém um identificador para o objeto de dados inicial que foi criado durante a criação do objeto ContentInfo para gravação. Durante a geração de pacotes de dados, o multiplexador adiciona pacotes ao objeto de dados e o atualiza adequadamente. Depois que o multiplexador gera todos os pacotes de dados, ele atualiza o objeto ContentInfo fornecido para que determinados valores, como o número de pacotes de dados, sejam atualizados.

O exemplo de código a seguir mostra como criar um multiplexador e inicializá-lo com um objeto ContentInfo.

//-------------------------------------------------------------------
// CreateOutputGenerators
//
// Creates the ASF mux and the ASF Content Info object for the 
// output file.
//-------------------------------------------------------------------

HRESULT CreateOutputGenerators(
    IMFASFProfile *pProfile, 
    IMFASFContentInfo **ppContentInfo, 
    IMFASFMultiplexer **ppMux
    )
{
    IMFASFContentInfo *pContentInfo = NULL;
    IMFASFMultiplexer *pMux = NULL;

    // Use the ASF profile to create the ContentInfo object.
    HRESULT hr = MFCreateASFContentInfo(&pContentInfo);

    if (SUCCEEDED(hr))
    {
        hr = pContentInfo->SetProfile(pProfile);
    }

    // Create the ASF Multiplexer object.
    if (SUCCEEDED(hr))
    {
        hr = MFCreateASFMultiplexer(&pMux);
    }
    
    // Initialize it using the new ContentInfo object.
    if (SUCCEEDED(hr))
    {
        hr = pMux->Initialize(pContentInfo);
    }

    // Return the pointers to the caller.
    if (SUCCEEDED(hr))
    {
        *ppContentInfo = pContentInfo;
        (*ppContentInfo)->AddRef();

        *ppMux = pMux;
        (*ppMux)->AddRef();
    }

    SafeRelease(&pContentInfo);
    SafeRelease(&pMux);

    return hr;
}

Para ver essa função usada em um aplicativo completo, consulte Tutorial: Copiando fluxos ASF de um arquivo para outro.

Inicialização do Multiplexer e configurações de bucket com vazamento

O método IMFASFMultiplexer::Initialize configura o multiplexador para determinar o fluxo de dados de bucket vazado. Para configurar esses parâmetros, verifique se os valores de propriedade a seguir estão definidos no objeto ContentInfo especificado. Para obter informações sobre como definir essas propriedades, consulte Definindo propriedades no objeto ContentInfo.

  • MFPKEY_ASFMEDIASINK_AUTOADJUST_BITRATE propriedade: isso indica se o multiplexador precisa ajustar a taxa de bits automaticamente para manter o fluxo de dados no bucket com vazamento. Essa configuração pode ser alterada pelo aplicativo chamando IMFASFMultiplexer::SetFlags e passando o sinalizador MFASF_MULTIPLEXER_AUTOADJUST_BITRATE .

  • MFPKEY_ASFMEDIASINK_BASE_SENDTIME propriedade: o tempo de envio indica quando o conteúdo dentro do bucket vazado será liberado. Os horários de envio devem ser iguais ou anteriores ao horário da apresentação, pois o conteúdo deve ter tempo para chegar ao destino antes do horário da apresentação.

    Esse valor da propriedade é a primeira hora de envio. O multiplexador usa esse valor para calcular os tempos de envio subsequentes para garantir que os dados fluam por meio do bucket de forma constante. Se o sinalizador MFASF_MULTIPLEXER_AUTOADJUST_BITRATE tiver sido definido no multiplexador, o multiplexador ajustará a taxa de bits para que o conteúdo seja enviado quando a janela do buffer estiver perto de estar cheia. Se o sinalizador não estiver definido, o multiplexador não gerará pacotes de dados devido à sobrecarga de largura de banda.

O multiplexador obtém informações de configuração de fluxo do perfil ASF associado ao objeto ContentInfo especificado no método Initialize . As informações de configuração de fluxo incluem parâmetros de bucket com vazamento. Esse valor é exigido pelo multiplexador para gerar pacotes de dados.

Para especificar os parâmetros de bucket com vazamento, defina os valores no atributo MF_ASFSTREAMCONFIG_LEAKYBUCKET1 no objeto de configuração de fluxo que representa o fluxo no perfil. Para usar o valor da janela do buffer, que é usado pelo codificador, chame IWMCodecLeakyBucket::GetBufferSizeBits. O valor real da janela do buffer é conhecido somente depois de definir o tipo de mídia de saída do codificador. Para obter informações sobre como definir o tipo de mídia de saída, consulte Media Type Negotiation no Codificador.

Observação

Os valores de bucket com vazamento usados pelo codificador podem ser diferentes no objeto ContentInfo fornecido pelo Perfil ASF que foi usado para criar o multiplexador.

 

O método Initialize atualiza o objeto ContentInfo para que os valores corretos sejam refletidos no objeto de cabeçalho ASF final.

Multiplexador ASF

Gerando novos pacotes de dados ASF