Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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 fonte 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 WMContainer Layer.
A fonte de mídia ASF implementa a interfaceIMFMediaSource, 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
- definições de configuração para a fonte de mídia ASF
- Modelo de objeto de origem de mídia ASF
- de Serviços de Fonte de Mídia ASF
- Tópicos relacionados
Criando a fonte de mídia ASF
Para criar a fonte de mídia ASF, o aplicativo deve usar o Source Resolver. 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 de criação da fonte de mídia a partir 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 em 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 de URL pode conter o caminho do arquivo de mídia ou pode ser prefixada com o esquema "arquivo: ". A extensão de nome de arquivo deve ser ".asf", ".wm", L".wma" ou ".wmv". Para um arquivo ASF na rede, o resolvedor de origem cria o Network Source, que usa a fonte de mídia ASF.
Durante o processo de criação do objeto, o resolvedor de origem procura a lista de manipuladores de esquema e os manipuladores de fluxo de bytes no registro do sistema e carrega o manipulador de correspondência mais próximo que pode analisar o conteúdo de mídia e também criar o objeto de fonte 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 Byte-Stream.
Para obter um exemplo de código sobre como criar uma fonte de mídia, consulte Usando o resolvedor de código-fonte.
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 é procurar. Se uma operação de busca for permitida, o aplicativo poderá especificar o modo de busca que a fonte de mídia usa ao procurar um ponto específico da apresentação.
Um aplicativo pode definir o modo de busca, para a fonte de mídia usar, 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 resolução 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 suporta os seguintes modos de busca:
- Busca exata: neste modo, a fonte de mídia ASF depende do objeto de índice ASF do arquivo ASF. Se o arquivo não tiver o objeto Index, 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: Este modo é solicitado pelo aplicativo passando MFPKEY_ASFMediaSource_ApproxSeek no repositório de propriedades para os métodos de resolução de origem relevantes. No entanto, a busca aproximada só é usada se o fluxo de bytes não oferecer suporte à busca baseada no tempo. Neste modo, a fonte de mídia determina uma hora de início que é 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 necessário 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 objeto Index, 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 para 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 resumo, 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 o interface IMFMediaSource e expõe as seguintes interfaces. 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. |
| FMIMetadata | Descreve os metadados para o arquivo ASF. |
| IMFMetadataProvider | Recupera uma coleção de metadados, seja para uma apresentação inteira ou para um fluxo na apresentação. |
| IMFRateSupport | Consulta a gama de taxas de reprodução suportadas, incluindo a 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 fonte. |
| IMFPMPClient | Permite que uma fonte de mídia receba um ponteiro para a interface deIMFPMPHost, que é usada para criar objetos no processo PMP. |
| IMFTimecodeTranslate | Converte entre códigos de tempo SMPTE (Society of Motion Picture and Television Engineers) 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 que têm 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 Service Interfaces.
| Identificador de serviço | Descrição |
|---|---|
| MF_RATE_CONTROL_SERVICE | Usando esse identificador, um aplicativo pode obter um ponteiro para IMFRateSupport ou interfaces de 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 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 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, Controle de Taxa. |
| MF_METADATA_PROVIDER_SERVICE | Usando esse identificador, o aplicativo pode obter um ponteiro para o IMFMetadataProvider interface 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 do descritor de apresentação e as informações de fluxo são fornecidas por meio de atributos do descritor de fluxo. Para obter mais informações sobre esses atributos, consulte Media Foundation Attributes for ASF Header Objects. 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 o IPropertyStore interface 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 em de log do cliente . |
| MF_TIMECODE_SERVICE | Usando esse identificador, o aplicativo pode obter um ponteiro para a interface de IMFTimecodeTranslate da fonte de mídia. Esta implementação pode ser usada para realizar traduções de código de tempo, como converter o código de tempo SMPTE para unidades de 100 nano segundos e vice-versa. |
Tradução de código de tempo
A fonte de mídia ASF fornece um serviço de traduçã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 tempo de apresentação solicitado. O serviço está disponível através da interface IMFTimecodeTranslate, que a fonte de mídia ASF implementa. As chamadas de método neste ponteiro de interface são assíncronas que podem ser executadas a partir do thread principal do aplicativo sem bloquear a interface do usuário do seu aplicativo.
As etapas a seguir resumem o procedimento de conversão de código de tempo:
- Obtenha o ponteiro para a interfaceIMFTimecodeTranslateda fonte de mídia ASF chamando MFGetService e especificando o identificador MF_TIMECODE_SERVICE.
- Chame IMFTimecodeTranslate::BeginConvertTimecodeToHNS ou IMFTimecodeTranslate::BeginConvertHNSToTimecode e especifique a hora a 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 deMFTIME.
- Conclua a operação assíncrona chamando IMFTimecodeTranslate::EndConvertTimecodeToHNS ou IMFTimecodeTranslate::EndConvertTimecodeToHNS apropriadamente.
Durante a criação da fonte de mídia, o resolvedor de origem cria um fluxo de bytes para o arquivo a partir 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 obtém 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 a conversão de código tempo-a-tempo de apresentação, 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 de 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 traduzir 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 analisa os pacotes ASF do fluxo são analisados até que o código de tempo correto seja atingido. Depois de encontrar o exemplo correto, ele recupera a hora de apresentação correspondente ou o código de hora do exemplo e o retorna ao chamador.
Suporte a comandos de script
Quando você cria uma topologia ASF que contém um fluxo de script, um nó de fluxo de script é adicionado à topologia. Este 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 úteis do fluxo de script são compactadas no buffer como uma cadeia de caracteres de tipo, seguida por NULL, seguida pela cadeia de comando, seguida por NULL. As cadeias de caracteres são Unicode no formato ASF.
Por exemplo, uma carga útil pode ter a seguinte aparência (onde \0 indica um caractere NULL):
URL\0http://contoso.com\0
Texto\0Esta é uma legenda\0
Tópicos relacionados