Partilhar via


Criando o objeto multiplexador

O multiplexador ASF é um objeto de camada WMContainer que funciona com o ASF Data Object e dá a um aplicativo a capacidade de gerar pacotes de dados ASF para fluxos de mídia.

O objeto multiplexador expõe o IMFASFMultiplexer interface. Para criar o multiplexador, chame MFCreateASFMultiplexer. Esta função retorna um ponteiro para um objeto vazio. Se o aplicativo estiver gravando um novo arquivo ASF, o aplicativo deve 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, tamanho do pacote, preroll. Opcionalmente, o multiplexador também pode precisar de parâmetros de bucket com vazamento e as unidades de extensão de carga útil. 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 configura 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 carga útil (consulte Criando e configurando fluxos ASF), e o multiplexador estiver 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 o processo de criação do objeto ContentInfo para fins de 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 certos 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 multiplexador e configurações de bucket com vazamento

O método IMFASFMultiplexer::Initialize configura o multiplexador para determinar o fluxo de dados do bucket com vazamento. Para configurar esses parâmetros, certifique-se de que os seguintes valores de propriedade sejam definidos no objeto ContentInfo especificado. Para obter informações sobre como definir essas propriedades, consulte Setting Properties 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 a carga útil dentro da caçamba com vazamento será liberada. Os tempos de envio devem ser iguais ou anteriores ao tempo de apresentação, porque a carga deve ter tempo para chegar ao destino antes do horário de apresentação.

    Este valor de propriedade refere-se ao primeiro tempo de envio. O multiplexador usa esse valor para calcular os tempos de envio subsequentes para garantir que os dados fluam através do bucket de forma constante. Se o sinalizador MFASF_MULTIPLEXER_AUTOADJUST_BITRATE tiver sido ativado no multiplexador, o multiplexador ajustará a taxa de bits para que a carga útil seja transmitida quando a janela do buffer estiver quase cheia. Se o sinalizador não estiver definido, o multiplexador não conseguirá gerar pacotes de dados devido à sobrecarga da largura de banda.

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

Para especificar os parâmetros do 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 de buffer, que é usado pelo codificador, chame IWMCodecLeakyBucket::GetBufferSizeBits. O valor real da janela de 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 Negociação de tipo de mídia no codificador.

Observação

Os valores de bucket com vazamento usados pelo codificador podem ser diferentes no objeto ContentInfo fornecido pelo perfil ASF 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