Partilhar via


Fonte de mídia ASF

O Media Foundation fornece a fonte de mídia ASF que um aplicativo pode usar para representar um arquivo ASF na camada de pipeline da arquitetura.

Para reproduzir um arquivo ASF, um aplicativo pode usar a fonte de mídia ASF para alimentar dados em um pipeline de reprodução. Em um cenário de codificação, o aplicativo pode usar a fonte de mídia ASF como a origem para converter em outro formato ou para converter um arquivo de taxa de bits mais alta em um arquivo de taxa de bits mais baixa sem alterar os formatos. A fonte de mídia ASF deve ser usada na camada de pipeline, ou seja, um aplicativo deve usar a Sessão de Mídia para controlar a operação. Esse nível de acesso permite que os aplicativos obtenham eventos enquanto a Sessão de Mídia está em andamento. Para obter acesso de nível inferior ao conteúdo ASF, um aplicativo deve usar os componentes ASF da camada WMContainer.

A fonte de mídia ASF implementa a interface IMFMediaSource , que é a interface genérica para fontes de mídia no Media Foundation. Como qualquer outra fonte de mídia, a fonte de mídia ASF fornece um descritor de apresentação que descreve principalmente o Objeto de Cabeçalho ASF. Além disso, a fonte de mídia ASF fornece descritores de fluxo que representam cada fluxo no conteúdo de mídia. Para obter mais informações, consulte Estrutura de arquivos ASF.

Criando a fonte de mídia ASF

Para criar a fonte de mídia ASF, o aplicativo deve usar o Resolvedor de Origem. Para criar a fonte de mídia ASF, o aplicativo deve fornecer a fonte para a qual o resolvedor de origem cria a fonte de mídia ASF. As informações de origem devem ser fornecidas especificando a URL do arquivo de origem ou o fluxo de bytes que contém a mídia. Se o aplicativo optar por criar a fonte de mídia ASF especificando a URL, ele deverá chamar IMFSourceResolver::CreateObjectFromURL para operação síncrona ou IMFSourceResolver::Begin... EndCreateObjectFromURL para operação assíncrona. O processo para criar a fonte de mídia de um fluxo de bytes é semelhante. O aplicativo deve chamar IMFSourceResolver::CreateObjectFromByteStream para operação síncrona ou IMFSourceResolver::Begin... EndCreateObjectFromBytestream para operação assíncrona. Essas chamadas devem especificar MF_RESOLUTION_MEDIASOURCE no parâmetro dwFlags . Para obter mais informações sobre como usar esse sinalizador, consulte Usando o Resolvedor de Origem.

Se o aplicativo especificar uma URL, para um arquivo local, a cadeia de caracteres da URL poderá conter o caminho do arquivo de mídia ou poderá ser prefixada com o esquema "file:". A extensão do nome do arquivo deve ser ".asf", ".wm", L".wma" ou ".wmv". Para um arquivo ASF na rede, o resolvedor de origem cria a Origem de Rede, que usa a fonte de mídia ASF.

Durante o processo de criação do objeto, o resolvedor de origem pesquisa a lista de manipuladores de esquema e os manipuladores de fluxo de bytes no registro do sistema e carrega o manipulador correspondente mais próximo que pode analisar o conteúdo de mídia e também criar o objeto de origem de mídia abaixo. Independentemente do método usado para criar a fonte de mídia (URL e fluxo de bytes), o resolvedor de origem cria um fluxo de bytes e lê o conteúdo da mídia de origem no fluxo de bytes. Para obter mais informações, consulte Manipuladores de esquema e manipuladores de fluxo de bytes.

Para obter um exemplo de código sobre como criar uma fonte de mídia, consulte Usando o Resolvedor de Origem.

Definições de configuração para a fonte de mídia ASF

O resolvedor de origem consulta os recursos do fluxo de bytes subjacente e determina que as operações são permitidas na fonte de mídia recém-criada. Uma dessas capacidades é a busca. Se uma operação de busca for permitida, o aplicativo poderá especificar o modo de busca que a fonte de mídia usa ao buscar um ponto específico na apresentação.

Um aplicativo pode definir o modo de busca, para a fonte de mídia a ser usada, durante a criação do objeto. Depois que a fonte de mídia ASF é criada com o modo de busca especificado, ela não pode ser modificada na fonte de mídia ou alterada dinamicamente durante uma apresentação. As preferências de busca são especificadas como propriedades na chamada do aplicativo para os métodos de resolvedor de origem relevantes que são usados para criar a fonte de mídia. Esse conjunto de propriedades é definido em um repositório de propriedades e passado para o parâmetro pProps . Se essas propriedades não forem passadas, a fonte de mídia funcionará com as configurações padrão. Para obter mais informações sobre como definir essas propriedades, consulte Configurando uma fonte de mídia.

Se a busca for permitida, a fonte de mídia ASF dará suporte aos seguintes modos de busca:

  • Busca exata: nesse modo, a fonte de mídia ASF depende do Objeto de Índice ASF do arquivo ASF. Se o arquivo não tiver o Index Object, a busca exata será desabilitada e um dos outros modos será usado dependendo das propriedades especificadas pelo aplicativo definidas na fonte de mídia.
  • Busca aproximada: esse modo é solicitado pelo aplicativo passando MFPKEY_ASFMediaSource_ApproxSeek no repositório de propriedades para os métodos de resolvedor de origem relevantes. No entanto, a busca aproximada só será usada se o fluxo de bytes não der suporte à busca baseada em tempo. Nesse modo, a fonte de mídia determina uma hora de início relativamente mais próxima da hora de busca. Se o arquivo ASF contiver um objeto de índice ASF, ele será usado para calcular a hora de início. A busca aproximada é menos precisa, mas mais rápida do que a busca exata, porque o tempo gasto para renderizar a primeira amostra na hora de início predeterminada é mais rápido.
  • Busca iterativa: para definir esse modo, o aplicativo deve definir a propriedade MFPKEY_ASFMediaSource_IterativeSeekIfNoIndex . A busca iterativa é um algoritmo para encontrar uma posição em um arquivo ASF que não contém nenhum objeto de índice ASF. Nesse modo, a fonte de mídia determina uma estimativa aproximada do ponto de busca lendo o deslocamento do fluxo de bytes. Ele usa uma série de aproximações, com base na taxa de bits média, para se aproximar progressivamente do tempo de busca alvo. (O algoritmo é semelhante a uma pesquisa binária.) A busca iterativa pode levar mais tempo do que a busca usando o Index Object, portanto, ela é desabilitada por padrão. Se você definir essa propriedade, use as seguintes propriedades para definir os parâmetros de pesquisa: MFPKEY_ASFMediaSource_IterativeSeek_Max_CountMFPKEY_ASFMediaSource_IterativeSeek_Tolerance_In_MilliSecond. Essas propriedades definem o número máximo de iterações e a tolerância, respectivamente. O algoritmo é interrompido quando atinge o número máximo de iterações ou quando encontra um pacote cuja distância do tempo de busca está dentro da tolerância especificada.

Em poucas palavras, o aplicativo tem a opção de escolher a busca aproximada ou iterativa quando o arquivo ASF não contém um objeto de índice ASF.

Modelo de objeto de origem de mídia ASF

A fonte de mídia ASF implementa a interface IMFMediaSource e expõe as interfaces a seguir. Um aplicativo pode obter uma referência a essas interfaces chamando IMFMediaSource::QueryInterface na fonte de mídia ASF.

Interface Descrição
IMFMediaSource Obrigatório para todas as fontes de mídia.
IMFMediaEventGenerator Obrigatório para todas as fontes de mídia. Permite que os aplicativos obtenham eventos da fonte de mídia por meio da Sessão de Mídia.
IMFGetService Consulta a fonte de mídia para a interface de serviço especificada.
IPropertyStore Define e obtém propriedades na fonte de mídia. Cada propriedade contém um nome descritivo e um valor.
IMFMetadata Descreve os metadados do arquivo ASF.
IMFMetadataProvider Recupera uma coleção de metadados, seja para uma apresentação inteira ou para um fluxo na apresentação.
IMFRateSupport Consulta o intervalo de taxas de reprodução com suporte, incluindo reprodução inversa.
IMFRateControl Obtém ou define a taxa de reprodução.
IMFTrustedInput Obtém o ITA para cada um dos fluxos ASF contidos na origem.
IMFPMPCliente Permite que uma fonte de mídia receba um ponteiro para a interface IMFPMPHost , que é usada para criar objetos no processo PMP.
IMFTimecodeTranslate Converte-se entre códigos de tempo da Society of Motion Picture and Television Engineers (SMPTE) e unidades de tempo de 100 nanossegundos.

 

Serviços de fonte de mídia ASF

A fonte de mídia ASF fornece vários serviços com escopo para o arquivo ASF. Para obter um ponteiro para um serviço específico, o aplicativo deve usar um dos seguintes identificadores de serviço em sua chamada para MFGetService. Para obter informações, consulte Interfaces de serviço.

Identificador de Serviço Descrição
MF_RATE_CONTROL_SERVICE Usando esse identificador, um aplicativo pode obter um ponteiro para interfaces IMFRateSupport ou IMFRateControl. Usando o objeto de suporte de taxa implementado pela fonte de mídia, o aplicativo pode verificar se uma taxa específica é suportada pelo arquivo de mídia ASF subjacente e também obter a taxa mais rápida e mais lenta. Usando o objeto de controle de taxa, o aplicativo pode obter e definir a taxa de reprodução. Se o aplicativo especificar uma taxa específica para reprodução, a fonte de mídia ASF primeiro verificará se a taxa solicitada está dentro dos limites de taxa (determinados por taxas em jejum e mais lentas) e, em seguida, definirá a taxa. Isso não verifica as condições variáveis, pois a taxa de bits pode mudar a qualquer momento, dependendo da largura de banda da rede. Para obter mais informações, consulte Controle de taxa.
MF_METADATA_PROVIDER_SERVICE Usando esse identificador, o aplicativo pode obter um ponteiro para a interface IMFMetadataProvider da fonte de mídia ASF. Essa interface fornece acesso a informações sobre o arquivo ASF, especificamente os objetos de cabeçalho ASF e os fluxos contidos no conteúdo de mídia. As informações de cabeçalho são expostas por meio de atributos de descritor de apresentação e as informações de fluxo são fornecidas por meio de atributos de descritor de fluxo. Para obter mais informações sobre esses atributos, consulte Atributos do Media Foundation para objetos de cabeçalho ASF. Além das informações que são expostas por meio de atributos, também existem metadados descritivos, que são definidos como propriedades.
MF_PROPERTY_HANDLER_SERVICE Usando esse identificador, o aplicativo pode obter um ponteiro para a interface IPropertyStore da fonte de mídia ASF. O repositório de propriedades contém todos os metadados relacionados ao arquivo ASF. Esse identificador é novo no Windows 7 e substitui MF_METADATA_PROVIDER_SERVICE para obter propriedades de metadados.
MFNETSOURCE_STATISTICS_SERVICE Para obter mais informações, consulte Recuperando estatísticas de rede no log do cliente.
MF_TIMECODE_SERVICE Usando esse identificador, o aplicativo pode obter um ponteiro para a interface IMFTimecodeTranslate da fonte de mídia. Essa implementação pode ser usada para executar traduções de código de tempo, como converter o código de tempo SMPTE em unidades de 100 nanossegundos e vice-versa.

 

Tradução de código de tempo

A fonte de mídia ASF fornece um serviço de conversão de código de tempo que permite que seu aplicativo converta o código de tempo SMPTE para o tempo de apresentação mais próximo (em unidade de 100 nanossegundos). Por outro lado, o aplicativo também pode obter o código de tempo para um horário de apresentação solicitado. O serviço está disponível por meio da interface IMFTimecodeTranslate , que a fonte de mídia ASF implementa. As chamadas de método nesse ponteiro de interface são assíncronas que podem ser executadas no thread principal do aplicativo sem bloquear a interface do usuário do aplicativo.

As etapas a seguir resumem o procedimento para conversão de código de tempo:

  1. Obtenha o ponteiro para a interface IMFTimecodeTranslate da fonte de mídia ASF chamando MFGetService e especificando o identificador MF_TIMECODE_SERVICE.
  2. Chame IMFTimecodeTranslate::BeginConvertTimecodeToHNS ou IMFTimecodeTranslate::BeginConvertHNSToTimecode e especifique a hora que deve ser traduzida.. Para BeginConvertTimecodeToHNS, o código de tempo deve ser especificado como uma variável PROPVARIANT com VT_I8 tipo de dados. O método BeginConvertHNSToTimecode requer o tempo em unidades de 100 nanossegundos como o tipo MFTIME .
  3. Conclua a operação assíncrona chamando IMFTimecodeTranslate::EndConvertTimecodeToHNS ou IMFTimecodeTranslate::EndConvertTimecodeToHNS adequadamente.

Durante a criação da fonte de mídia, o resolvedor de origem cria um fluxo de bytes para o arquivo do qual a fonte de mídia lê o conteúdo ASF. Para que as conversões de tempo sejam bem-sucedidas, o fluxo de bytes associado ao arquivo ASF deve ter recursos de busca; caso contrário, o aplicativo obterá o erro MF_E_BYTESTREAM_NOT_SEEKABLE da chamada Begin.... Outro requisito para conversões de tempo é que o arquivo ASF, representado pela fonte de mídia ASF, deve ter objetos de índice ASF. Os tempos de apresentação e os códigos de tempo são extraídos dos objetos de índice ASF que mantêm todos os índices e os pontos de busca correspondentes para o arquivo ASF. Para tradução de código de apresentação de tempos em tempos, o arquivo ASF deve conter um Objeto de Índice Simples; para conversão de tempo de código para tempo de apresentação, o arquivo ASF deve ter um Objeto de Índice. As operações de conversão dependem do indexador subjacente (componente WMContainer) para analisar e ler o Objeto de Índice associado ao arquivo ASF. Se o arquivo não contiver um objeto de índice, o aplicativo receberá de forma assíncrona o código de erro MF_E_NO_INDEX.

Para converter o tempo solicitado pelo aplicativo, a fonte de mídia enumera os fluxos dentro do arquivo e localiza o fluxo que contém o Objeto de Índice ASF apropriado. Se esse fluxo for encontrado, a fonte de mídia analisará os pacotes ASF do fluxo e será analisado até que o código de tempo correto seja atingido. Depois de encontrar o exemplo correto, ele recupera o tempo de apresentação correspondente ou o código de tempo do exemplo e o retorna ao chamador.

Suporte a comandos de script

Quando você constrói uma topologia ASF que contém um fluxo de script, um nó Script Stream é adicionado à topologia. Esse nó enviará IMFSamples no momento apropriado. O IMFSample fornecido pelo nó de origem do script armazena os dados no IMFMediaBuffer associado ao exemplo. Você pode chamar CopyToBuffer no exemplo para obter um IMFMediaBuffer e, em seguida, chamar Lock no buffer para obter os dados.

As cargas de fluxo de script são empacotadas no buffer como uma cadeia de caracteres de tipo, seguida por NULL, seguida pela cadeia de caracteres de comando, seguida por NULL. As cadeias de caracteres são Unicode no formato ASF.

Por exemplo, uma carga pode ser semelhante à seguinte (em que \0 indica um caractere NULL):

URL\0http://contoso.com\0

Texto\0Esta é uma legenda\0

Componentes ASF da camada de tubulação

Suporte a ASF no Media Foundation