Como fazer streaming de vídeos ao vivo

A API de streaming do Video Intelligence oferece suporte a protocolos padrão de transmissão ao vivo, como RTSP, RTMP e HLS. O pipeline de processamento do AIStreamer se comporta como um proxy de streaming, convertendo protocolos de transmissão ao vivo em conexão gRPC de streaming bidirecional.

Para oferecer suporte a protocolos de transmissão ao vivo, o Video Intelligence usa o framework de mídia aberta do GStreamer.

Etapa 1: criar um pipe nomeado

Um pipe nomeado é criado para se comunicar entre o proxy de processamento do GStreamer do AIStreamer. Os dois processos são executados no mesmo contêiner do Docker.

  • path_to_pipe: caminho do arquivo no ambiente local. Por exemplo, /user/local/Desktop/
  • name_of_pipe: nome da barra vertical fornecido. Por exemplo, my-football-game
$ export PIPE_NAME=/path_to_pipe/name_of_pipe
$ mkfifo $PIPE_NAME

Exemplo: /user/local/Desktop/my-football-game

Etapa 2: executar o proxy de processamento do AIStreamer

Esses exemplos de C++, disponíveis para seu uso, incluem um único binário compatível com todos os recursos. Para criar os exemplos, siga estas instruções de compilação.

O exemplo a seguir mostra como usar o binário na linha de comando.

$ export GOOGLE_APPLICATION_CREDENTIALS=/path_to_credential/credential_json
$ export CONFIG=/path_to_config/config_json
$ export PIPE_NAME=/path_to_pipe/name_of_pipe
$ export TIMEOUT=3600
$ ./streaming_client_main --alsologtostderr --endpoint "dns:///alpha-videointelligence.googleapis.com" \
      --video_path=$PIPE_NAME --use_pipe=true --config=$CONFIG --timeout=$TIMEOUT

$GOOGLE_APPLICATION_CREDENTIALS especifica o caminho do arquivo JSON que contém a chave da conta de serviço.

É possível encontrar um exemplo de arquivo de configuração $CONFIG em github.

Certifique-se de definir a sinalização de tempo limite correto na linha de comando. Se você precisar fazer o streaming de uma hora de vídeo, o valor do tempo limite deve ser de pelo menos 3.600 segundos.

Etapa 3: executar o pipeline do GStreamer

O GStreamer é compatível com vários protocolos de transmissão ao vivo, incluindo entre outros:

  • HTTP Live Streaming (HLS)

  • Real-time Streaming Protocol (RTSP)

  • Real-time Protocol (RTP)

  • Real-time Messaging Protocol (RTMP)

  • WebRTC

  • Streaming pela webcam

A API Video Intelligence usa o pipeline GStreamer para converter esses protocolos de transmissão ao vivo em um stream de vídeo decodificável e grava o stream no pipe nomeado criado na Etapa 1.

Os exemplos a seguir demonstram como usar a biblioteca de transmissão ao vivo usando protocolos HLS, RTSP e RTMP.

HTTP Live Streaming (HLS)

$ export PIPE_NAME=/path_to_pipe/name_of_pipe
$ export HLS_SOURCE=http://abc.def/playlist.m3u8
$ gst-launch-1.0 -v souphttpsrc location=$HLS_SOURCE ! hlsdemux ! filesink location=$PIPE_NAME

Real-time Streaming Protocol (RTSP)

$ export PIPE_NAME=/path_to_pipe/name_of_pipe
$ export RTSP_SOURCE=rtsp://ip_addr:port/stream
$ gst-launch-1.0 -v rtspsrc location=$RTSP_SOURCE ! rtpjitterbuffer ! rtph264depay \
      ! h264parse ! flvmux ! filesink location=$PIPE_NAME

Real-time Message Protocol (RTMP)

$ export PIPE_NAME=/path_to_pipe/name_of_pipe
$ export RTMP_SOURCE=rtmp://host/app/stream
$ gst-launch-1.0 -v rtmpsrc location=$RTMP_SOURCE ! flvdemux ! flvmux ! filesink location=$PIPE_NAME

Criar instruções

O exemplo binário é criado com o Bazel. Também é fornecido um exemplo do Docker que tenha todas as dependências de criação configuradas. Você pode encontrar o binário streaming_client_main compilado no diretório $BIN_DIR da imagem do Docker.

Para mais informações sobre o uso do Docker, consulte Como usar o Docker e o Kubernetes.

Controle de fluxo

O servidor da API de streaming do Video Intelligence conta com controle de fluxo. Nos dois casos a seguir, as solicitações StreamingAnnotateVideoRequest são rejeitadas e as conexões de streaming do gRPC são interrompidas imediatamente:

  • O cliente de processamento do AIStreamer está enviando solicitações aos servidores do Google com muita frequência.

  • O cliente de processamento do AIStreamer está enviando muitos dados aos servidores do Google (além de 20 Mbytes por segundo).

Visualizador

O código do visualizador fornecido no AIStreamer só deve ser considerado como um exemplo de código. O visualizador não pode ser compatível com o ambiente local do usuário. Os usuários do AIStreamer não devem confiar no código do cliente para visualizar os resultados da anotação.