View a markdown version of this page

Reprodução de vídeo com HLS - Amazon Kinesis Video Streams

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Reprodução de vídeo com HLS

O HTTP Live Streaming (HLS) é um protocolo de comunicação de streaming de HTTP-based mídia padrão do setor. Você pode usar o HLS para visualizar um stream de vídeo do Kinesis, seja para reprodução ao vivo ou para visualizar vídeos arquivados.

Você pode usar HLS para reprodução ao vivo. Normalmente, a latência é de 3 a 5 segundos, mas pode estar entre 1 e 10 segundos, dependendo do caso de uso, do player e das condições da rede. Você pode usar um player de terceiros (como Video.js o Google Shaka Player) para exibir o stream de vídeo fornecendo o URL da sessão de streaming HLS, de forma programática ou manual. Você também pode reproduzir o vídeo inserindo o URL da sessão de streaming HLS na barra de localização dos navegadores Apple Safari ou Microsoft Edge.

Para ver um stream de vídeo do Kinesis usando HLS, primeiro crie uma sessão de streaming usando. GetHLSStreamingSessionURL Essa ação retorna uma URL (contendo um token de sessão) para acessar a sessão HLS. Em seguida, você pode usar a URL em um player de mídia ou em um aplicativo autônomo para exibir o streaming.

Importante

Nem todas as mídias enviadas para o Kinesis Video Streams podem ser reproduzidas por meio do HLS. Consulte GetHLSStreamingSessionURL os requisitos específicos de upload.

Use o comando AWS CLI para recuperar um URL de sessão de streaming HLS

O procedimento a seguir demonstra como usar o AWS CLI para gerar uma URL de sessão de streaming HLS para um stream de vídeo do Kinesis.

Para obter instruções de instalação, consulte o Guia AWS Command Line Interface do usuário. Após a instalação, configure o AWS CLI com credenciais e região.

Como alternativa, abra o AWS CloudShell terminal, que tem o AWS CLI instalado e configurado. Consulte o Guia do usuário do AWS CloudShell para obter mais informações.

Recupere o endpoint de URL HLS para seu stream de vídeo do Kinesis.
  1. Digite o seguinte no terminal:

    aws kinesisvideo get-data-endpoint \ --api-name GET_HLS_STREAMING_SESSION_URL \ --stream-name YourStreamName

    Você receberá uma resposta parecida com esta:

    { "DataEndpoint": "https://b-1234abcd.kinesisvideo.aws-region.amazonaws.com" }
  2. Faça a solicitação de URL da sessão de streaming HLS para esse endpoint retornado.

    Live

    Para reprodução ao vivo, a lista de reprodução de mídia HLS é atualizada continuamente com a mídia mais recente à medida que é disponibilizada. Quando você reproduz esse tipo de sessão em um media player, a interface do usuário normalmente exibe uma notificação “ao vivo”, sem controle de depuração para escolher a posição na janela de reprodução a ser exibida.

    Certifique-se de fazer upload de mídia para esse fluxo ao executar esse comando.

    aws kinesis-video-archived-media get-hls-streaming-session-url \ --endpoint-url https://b-1234abcd.kinesisvideo.aws-region.amazonaws.com \ --stream-name YourStreamName \ --playback-mode LIVE
    Live replay

    Para a reprodução ao vivo, a reprodução começa a partir de uma hora de início especificada. A playlist de mídia HLS também é atualizada continuamente com as mídias mais recentes à medida que são disponibilizadas. A sessão continuará a incluir mídia recém-ingerida até que a sessão expire ou até o horário de término especificado, o que ocorrer primeiro. Esse modo é útil para poder iniciar a reprodução a partir do momento em que um evento é detectado e continuar transmitindo ao vivo a mídia que ainda não foi ingerida no momento da criação da sessão.

    Determine um carimbo de data e hora de início.

    Neste exemplo, usamos a hora Unix Epoch no formato de segundos. Consulte a seção Carimbos de data/hora no Guia do AWS Command Line Interface usuário para obter mais informações sobre a formatação de carimbos de data/hora.

    Consulte UnixTime.org uma ferramenta de conversão.

    • 1708471800 é igual a 20 de fevereiro de 2024 às 15:30:00 GMT-08:00

    Neste exemplo, não especificamos um carimbo de data e hora de término, o que significa que a sessão continuará a incluir mídia recém-ingerida até que a sessão expire.

    Invoque a GetHLSStreamingSessionURL API com o modo de LIVE_REPLAY reprodução e um seletor de fragmentos HLS especificado.

    aws kinesis-video-archived-media get-hls-streaming-session-url \ --endpoint-url https://b-1234abcd.kinesisvideo.aws-region.amazonaws.com \ --stream-name YourStreamName \ --playback-mode LIVE_REPLAY \ --hls-fragment-selector \ "FragmentSelectorType=SERVER_TIMESTAMP,TimestampRange={StartTimestamp=1708471800}"
    On-demand

    Para reprodução sob demanda, a lista de reprodução de mídia HLS contém a mídia especificada pelo seletor de fragmentos HLS. Quando esse tipo de sessão é reproduzido em um media player, a interface do usuário normalmente exibe um controle de depuração para escolher a posição na janela de reprodução a ser exibida.

    Para criar um URL para uma determinada seção do stream, primeiro determine os carimbos de data e hora de início e término.

    Neste exemplo, usamos a hora Unix Epoch no formato de segundos. Consulte a seção Carimbos de data/hora no Guia do AWS Command Line Interface usuário para obter mais informações sobre a formatação de carimbos de data/hora.

    Consulte UnixTime.org uma ferramenta de conversão.

    • 1708471800 é igual a 20 de fevereiro de 2024 às 15:30:00 GMT-08:00

    • 1708471860 é igual a 20 de fevereiro de 2024 15:31:00 GMT-08:00

    Invoque a GetHLSStreamingSessionURL API com o modo de ON_DEMAND reprodução e um seletor de fragmentos HLS especificado.

    aws kinesis-video-archived-media get-hls-streaming-session-url \ --endpoint-url https://b-1234abcd.kinesisvideo.aws-region.amazonaws.com \ --stream-name YourStreamName \ --playback-mode ON_DEMAND \ --hls-fragment-selector \ "FragmentSelectorType=SERVER_TIMESTAMP,TimestampRange={StartTimestamp=1708471800,EndTimestamp=1708471860}"
    nota

    Os carimbos de data/hora devem estar dentro de 24 horas um do outro, conforme mencionado na documentação. HLSTimestampRange

    Você receberá uma resposta parecida com esta:

    { "HLSStreamingSessionURL": "https://b-1234abcd.kinesisvideo.aws-region.amazonaws.com/hls/v1/getHLSMasterPlaylist.m3u8?SessionToken=CiAz...DkRE6M~" }
    Importante

    Não compartilhe nem armazene esse token onde uma entidade não autorizada possa acessá-lo. O token fornece acesso ao conteúdo do stream. Proteja o token com as mesmas medidas que você usaria com suas AWS credenciais.

    Você pode usar esse URL e qualquer player HLS para visualizar o fluxo HLS.

    Por exemplo, use o VLC media player.

    Você também pode reproduzir o HLS Stream inserindo o URL da sessão de streaming HLS na barra de localização dos navegadores Apple Safari ou Microsoft Edge.

Exemplo: use HLS em HTML e JavaScript

O exemplo a seguir mostra como usar o AWS SDK para JavaScript v2 para recuperar uma sessão de streaming HLS para um stream de vídeo do Kinesis e reproduzi-la em uma página da web. O exemplo mostra como reproduzir vídeo nos seguintes players:

Veja o código de exemplo completo e a página da web hospedada em GitHub. Essa página da web estática simplifica os testes e a experimentação com o HLS e a MPEG-DASH saída do stream de vídeo do Amazon Kinesis. A página de exemplo fornece campos de entrada para os seguintes parâmetros:

  • Região da AWS: A região em que seu stream de vídeo do Kinesis está localizado

  • Nome do stream: o nome do seu stream de vídeo do Kinesis

  • Modo de reprodução: O modo de reprodução HLS (LIVE, LIVE_REPLAY ou ON_DEMAND)

  • Tipo de seletor de fragmento: o método usado para selecionar fragmentos (SERVER_TIMESTAMP ou PRODUCER_TIMESTAMP)

  • Número do fragmento: o número do fragmento inicial (quando aplicável)

  • Formato do contêiner: o formato do contêiner de mídia (FRAGMENTED_MP4 ou MPEG_TS)

O aplicativo recupera esses valores das caixas de entrada na página HTML e os usa para criar a solicitação de uma sessão de streaming HLS exibida na página.

Importe o AWS SDK JavaScript para navegadores

Na página da web, inclua a tag de script a seguir para importar o AWS SDK para JavaScript v2 no projeto.

<script src="https://cdnjs.cloudflare.com/ajax/libs/aws-sdk/2.490.0/aws-sdk.min.js"></script>

Para obter mais informações, consulte o AWS SDK para obter a JavaScript documentação.

Configurar o cliente Kinesis Video Streams

Para acessar o streaming de vídeo com HLS, primeiro crie e configure o cliente Kinesis Video Streams. Consulte Definindo credenciais em um navegador da Web para outros métodos de autenticação.

const clientConfig = { accessKeyId: 'YourAccessKey', secretAccessKey: 'YourSecretKey', region: 'us-west-2' }; const kinesisVideoClient = new AWS.KinesisVideo(clientConfig);

O aplicativo recupera os valores necessários das caixas de entrada na página HTML.

Recupere o endpoint para reprodução em HLS

Use o cliente Kinesis Video Streams para invocar a GetDataEndpoint API para recuperar o endpoint.

const getDataEndpointOptions = { StreamName: 'YourStreamName', APIName: 'GET_HLS_STREAMING_SESSION_URL' }; const getDataEndpointResponse = await kinesisVideoClient .getDataEndpoint(getDataEndpointOptions) .promise(); const hlsDataEndpoint = getDataEndpointResponse.DataEndpoint;

Esse código armazena o endpoint na hlsDataEndpoint variável.

Configurar o cliente de mídia arquivada Kinesis Video Streams

Na configuração do cliente de mídia arquivada Kinesis Video Streams, especifique o endpoint que você obteve na etapa anterior.

const archivedMediaClientConfig = { accessKeyId: 'YourAccessKey', secretAccessKey: 'YourSecretKey', region: 'us-west-2', endpoint: hlsDataEndpoint }; const kinesisVideoArchivedMediaClient = new AWS.KinesisVideoArchivedMedia(archivedMediaClientConfig);

Recupere o URL da sessão de streaming HLS

Use o cliente de mídia arquivada Kinesis Video Streams para invocar a GetHLSStreamingSessionURL API e recuperar o URL de reprodução do HLS.

const getHLSStreamingSessionURLOptions = { StreamName: 'YourStreamName', PlaybackMode: 'LIVE' }; const getHLSStreamingSessionURLResponse = await kinesisVideoArchivedMediaClient .getHLSStreamingSessionURL(getHLSStreamingSessionURLOptions) .promise(); const hlsUrl = getHLSStreamingSessionURLResponse.HLSStreamingSessionURL;

Exibir o fluxo HLS na página da web

Quando tiver a URL da sessão de streaming HLS, forneça-a para o player de vídeo. O método para fornecer a URL ao player de vídeo é específico ao player usado.

Video.js

Faça o seguinte para importar Video.js suas classes CSS em nosso script de navegador:

<link rel="stylesheet" href="https://vjs.zencdn.net/6.6.3/video-js.css"> <script src="https://vjs.zencdn.net/6.6.3/video.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/videojs-contrib-hls/5.14.1/videojs-contrib-hls.js"></script>

Crie um elemento video HTML para exibir o vídeo:

<video id="videojs" class="player video-js vjs-default-skin" controls autoplay></video>

Defina o URL do HLS como a fonte do elemento de vídeo HTML:

const playerElement = document.getElementById('videojs'); const player = videojs(playerElement); player.src({ src: hlsUrl, type: 'application/x-mpegURL' }); player.play();
Shaka

Faça o seguinte para importar o player do Google Shaka para o script do nosso navegador:

<script src="https://cdnjs.cloudflare.com/ajax/libs/shaka-player/2.4.1/shaka-player.compiled.js"></script>

Crie um elemento video HTML para exibir o vídeo:

<video id="shaka" class="player" controls autoplay></video>

Crie um player Shaka especificando o elemento de vídeo e chame o método de carregamento:

const playerElement = document.getElementById('shaka'); const player = new shaka.Player(playerElement); player.load(hlsUrl);
hls.js

Faça o seguinte para importar hls.js para o script do nosso navegador:

<script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>

Crie um elemento video HTML para exibir o vídeo:

<video id="hlsjs" class="player" controls autoplay></video>

Crie um player hls.js, forneça a URL HLS e peça para ele jogar:

const playerElement = document.getElementById('hlsjs'); const player = new Hls(); player.loadSource(hlsUrl); player.attachMedia(playerElement); player.on(Hls.Events.MANIFEST_PARSED, function() { video.play(); });

Solução de problemas de HLS

Esta seção descreve os problemas que você pode encontrar ao usar HTTP Live Streaming (HLS) com o Kinesis Video Streams.

A recuperação do URL da sessão de streaming HLS foi bem-sucedida, mas a reprodução no player de vídeo apresentou falha

Essa situação ocorre quando o URL de uma sessão de streaming HLS pode ser recuperada com êxito usando GetHLSStreamingSessionURL, mas a reprodução do vídeo falha quando o URL é fornecido a um player de vídeo.

Para solucionar essa situação, tente o seguinte:

  • Determine se o stream de vídeo é reproduzido no console Kinesis Video Streams. Considere qualquer erro que o console mostra.

  • Se a duração de fragmento for menor que um segundo, aumente-a para um segundo. Se a duração do fragmento for muito curta, o serviço poderá limitar o player porque ele está fazendo solicitações de fragmentos de vídeo com muita frequência.

  • Verifique se a URL de cada sessão de streaming HLS está sendo usada por apenas um player. Se mais de um player estiver usando um único URL de sessão de streaming HLS, o serviço poderá receber muitas solicitações e limitá-las.

  • Verifique se o seu player suporta todas as opções que você está especificando para a sessão de streaming HLS. Experimente diferentes combinações de valores para os seguintes parâmetros:

    • ContainerFormat

    • PlaybackMode

    • FragmentSelectorType

    • DiscontinuityMode

    • MaxMediaPlaylistFragmentResults

    Alguns players de mídia (como HTML5 e players móveis) normalmente oferecem suporte apenas a HLS com o formato de contêiner fMP4. Outros reprodutores de mídia (como Flash e reprodutores personalizados) podem oferecer suporte apenas ao HLS com o formato de contêiner MPEG TS. Recomendamos experimentar o ContainerFormat parâmetro para iniciar a solução de problemas.

  • Verifique se cada fragmento tem um número consistente de trilhas. Verifique se os fragmentos no fluxo não estão mudando entre ter uma faixa de áudio e vídeo e somente uma faixa de vídeo. Verifique também se as configurações do codificador (resolução e taxa de quadros) não estão mudando entre os fragmentos em cada faixa.

Latência muito alta entre o produtor e o player

Essa situação ocorre quando a latência é muito alta em relação a quando o vídeo é capturado e quando é reproduzido no player de vídeo.

O vídeo é reproduzido por meio de HLS por fragmento. Portanto, a latência não pode ser menor que a duração do fragmento. A latência também inclui o tempo necessário para o armazenamento em buffer e a transferência de dados. Se a sua solução exigir latência menor que um segundo, considere usar a API GetMedia.

É possível ajustar os parâmetros a seguir para reduzir a latência geral, mas o ajuste desses parâmetros também pode reduzir a qualidade do vídeo ou aumentar a taxa de rearmazenamento em buffer.

  • Duração do fragmento — A duração do fragmento é a quantidade de vídeo entre as divisões no fluxo, controlada pela frequência dos quadros-chave gerados pelo codificador de vídeo. O valor recomendado é um segundo. Ter uma duração de fragmento mais curta significa que menos tempo é gasto aguardando que o fragmento seja concluído para transmitir os dados do vídeo para o serviço. Fragmentos mais curtos também são mais rápidos para o serviço processar. No entanto, se a duração de fragmento for muito curta, aumentará a probabilidade do player não ter conteúdo suficiente e precisar interromper e armazenar o conteúdo em buffer. Se a duração de fragmento for inferior a 500 milissegundos, o produtor poderá criar muitas solicitações, fazendo com que o serviço as limite.

  • Taxa de bits — Um stream de vídeo com uma taxa de bits menor leva menos tempo para ler, gravar e transmitir. No entanto, um streaming de vídeo com uma taxa de bits menor tem menor qualidade de vídeo.

  • Contagem de fragmentos em playlists de mídia — Um player sensível à latência só deve carregar os fragmentos mais recentes em uma playlist de mídia. Em vez disso, a maioria dos jogadores começa com o fragmento mais antigo. Ao reduzir o número de fragmentos na playlist, você reduz o tempo de separação entre os fragmentos anteriores e novos. Com um tamanho menor de playlist, é possível que um fragmento seja ignorado durante a reprodução se houver um atraso na adição de novos fragmentos à playlist ou se houver um atraso na atualização da playlist pelo player. Recomendamos usar de 3 a 5 fragmentos e usar um player configurado para carregar somente os fragmentos mais recentes de uma playlist.

  • Tamanho do buffer do player — A maioria dos reprodutores de vídeo tem uma duração mínima de buffer configurável, geralmente com um padrão de 10 segundos. Para a latência mais baixa, o valor pode ser definido como 0 segundos. No entanto, isso significa que o jogador rejeita se houver algum atraso na produção de fragmentos, pois o jogador não terá nenhum buffer para absorver o atraso.

  • “Atualização” do player — Os reprodutores de vídeo normalmente não capturam automaticamente a reprodução até a frente do buffer de vídeo se o buffer estiver cheio, como quando um fragmento atrasado causa a reprodução de um acúmulo de fragmentos. Um player personalizado pode evitar isso descartando quadros ou aumentando a velocidade de reprodução (por exemplo para 1.1x) para alcançar a frente do buffer. Isso faz com que a reprodução fique instável ou que a velocidade aumente conforme o player faz a correção, e o rearmazenamento em buffer pode ser mais frequente como o tamanho do buffer permanece curto.