Método IMFMediaSource::Start (mfidl.h)
Inicia, procura ou reinicia a fonte de mídia especificando onde iniciar a reprodução.
Sintaxe
HRESULT Start(
[in] IMFPresentationDescriptor *pPresentationDescriptor,
[in] const GUID *pguidTimeFormat,
[in] const PROPVARIANT *pvarStartPosition
);
Parâmetros
[in] pPresentationDescriptor
Ponteiro para a interface IMFPresentationDescriptor do descritor de apresentação da fonte de mídia. Para obter o descritor de apresentação, chame IMFMediaSource::CreatePresentationDescriptor. Você pode modificar o descritor de apresentação antes de chamar Iniciar para selecionar ou desmarcar fluxos ou alterar os tipos de mídia.
[in] pguidTimeFormat
Ponteiro para um GUID que especifica o formato de hora. O formato de hora define as unidades para o parâmetro pvarStartPosition . Se o valor for GUID_NULL, o formato de hora será unidades de 100 nanossegundos. Algumas fontes de mídia podem dar suporte a GUIDs de formato de tempo adicionais. Este parâmetro pode ser NULL. Se o valor for NULL, ele será equivalente a GUID_NULL.
[in] pvarStartPosition
Especifica onde iniciar a reprodução. As unidades desse parâmetro são indicadas pelo formato de hora dado em pguidTimeFormat. Se o formato de hora for GUID_NULL, o tipo de variante deverá ser VT_I8 ou VT_EMPTY. Use VT_I8 para especificar uma nova posição inicial, em unidades de 100 nanossegundos. Use VT_EMPTY para começar da posição atual. Outros formatos de hora podem usar outros tipos PROPVARIANT .
Retornar valor
O método retorna um HRESULT. Os possíveis valores incluem, mas sem limitação, aqueles na tabela a seguir.
Código de retorno | Descrição |
---|---|
|
O método foi bem-sucedido. |
|
A posição inicial já passou do final da apresentação (fonte de mídia ASF). |
|
Um dispositivo de hardware não pôde iniciar o streaming. Esse código de erro pode ser retornado por uma fonte de mídia que representa um dispositivo de hardware, como uma câmera. Por exemplo, se a câmera já estiver sendo usada por outro aplicativo, o método poderá retornar esse código de erro. |
|
A solicitação inicial não é válida. Por exemplo, a posição inicial está além do final da apresentação. |
|
O método Shutdown da fonte de mídia foi chamado. |
|
A fonte de mídia não dá suporte ao formato de hora especificado em pguidTimeFormat. |
Comentários
Esse método é assíncrono. Se a operação for bem-sucedida, a fonte de mídia enviará os seguintes eventos:
- Para cada novo fluxo, a origem envia um evento MENewStream . Esse evento é enviado para a primeira chamada iniciar na qual o fluxo é exibido. Os dados do evento são um ponteiro para a interface IMFMediaStream do fluxo.
- Para cada fluxo atualizado , a origem envia um evento MEUpdatedStream . Um fluxo será atualizado se o fluxo já existir quando Start foi chamado (por exemplo, se o aplicativo buscar durante a reprodução). Os dados do evento são um ponteiro para a interface IMFMediaStream do fluxo.
- Se o estado anterior tiver sido interrompido, a origem enviará um evento MESourceStarted .
- Se o estado anterior foi iniciado ou pausado e a posição inicial é a posição atual (VT_EMPTY), a origem envia um evento MESourceStarted .
- Se o estado anterior tiver sido iniciado ou pausado e uma nova posição inicial for especificada, a origem enviará um evento MESourceSeeked .
- Se a origem enviar um evento MESourceStarted , cada fluxo de mídia enviará um evento MEStreamStarted . Se a origem enviar um evento MESourceSeeked , cada fluxo enviará um evento MEStreamSeeked .
Uma chamada para Iniciar resulta em uma busca se o estado anterior foi iniciado ou pausado e a nova posição inicial não é VT_EMPTY. Nem todas as fontes de mídia podem procurar. Se uma fonte de mídia puder buscar, o método IMFMediaSource::GetCharacteristics retornará o sinalizador MFMEDIASOURCE_CAN_SEEK .
Os eventos da fonte de mídia não são sincronizados com eventos dos fluxos de mídia. Se você buscar uma fonte de mídia, portanto, ainda poderá receber amostras da posição anterior após obter o evento MESourceSeeked . Se você precisar sincronizar as operações, aguarde o evento de fluxo , MEStreamSeeked, que marca o ponto exato no fluxo em que a busca ocorre.
Fim do Stream
Quando um fluxo é reproduzido até o final, o fluxo envia um evento MEEndOfStream . Quando todos os fluxos selecionados atingirem o final, a fonte de mídia enviará um evento MEEndOfPresentation .Se a posição inicial estiver após o final de um fluxo selecionado (mas antes do final da apresentação), o fluxo deverá enviar MEEndOfStream imediatamente após MEStreamStarted/MEStreamSeeked. Se a reprodução atingir o final da apresentação e Iniciar for chamada novamente da posição atual, os fluxos enviarão novamente o evento MEEndOfStream e a fonte de mídia enviará novamente o evento MEEndOfPresentation . Esses eventos informam o pipeline para não solicitar mais dados.
Durante a reprodução inversa, o início do arquivo é considerado o fim do fluxo. Para obter mais informações, consulte Implementando o controle de taxa.
Implementando o início
Quando uma fonte de mídia executa uma busca, ela deve começar no primeiro quadro-chave antes da hora de busca, para que o decodificador possa decodificar os exemplos para a hora de início de destino. O pipeline descartará todos os exemplos decodificados que forem muito cedo.Se a hora de início for VT_EMPTY e o estado anterior tiver sido iniciado ou pausado, a origem deverá retomar da posição atual. Nesse caso, não é necessário reenviar o quadro-chave anterior, pois o decodificador ainda terá os dados que foram enviados anteriormente.
Ao validar o parâmetro pPresentationDescriptor, a fonte de mídia deve marcar apenas para as informações de que precisa funcionar corretamente. Em particular, o cliente pode adicionar atributos privados ao descritor de apresentação. A presença de atributos adicionais não deve fazer com que o método Start falhe.
Depois que Start é chamado, cada fluxo na fonte de mídia deve fazer um dos seguintes procedimentos:
- Forneça dados de mídia em resposta às chamadas IMFMediaStream::RequestSample .
- Envie eventos MEStreamTick para indicar uma lacuna no fluxo.
- Envie um evento MEEndOfStream para indicar o fim do fluxo.
Exemplos
O exemplo a seguir inicia a reprodução em 1 segundo na apresentação.
PROPVARIANT var;
PropVariantInit(&var);
var.vt = VT_I8;
var.hVal.QuadPart = 10000000; // 10^7 = 1 second.
hr = pSource->Start(pPresentationDescriptor, NULL, &var);
Requisitos
Requisito | Valor |
---|---|
Cliente mínimo com suporte | Windows Vista [aplicativos da área de trabalho | Aplicativos UWP] |
Servidor mínimo com suporte | Windows Server 2008 [aplicativos da área de trabalho | Aplicativos UWP] |
Plataforma de Destino | Windows |
Cabeçalho | mfidl.h |
Biblioteca | Mfuuid.lib |