Cómo transmitir videos en vivo

La API de transmisión de Video Intelligence admite protocolos de transmisión en vivo estándar, como RTSP, RTMP y HLS. El AIStreamer la canalización de transferencia se comporta como un proxy de transmisión, protocolos de transmisión a una conexión gRPC de transmisión bidireccional.

Para admitir protocolos de transmisión en vivo, la API de Video Intelligence usa el marco de trabajo de medios abiertos GStreamer.

Paso 1: Crea una barra con nombre

Se crea una canalización con nombre para comunicarse entre GStreamer y el proxy de transferencia de AIStreamer. Los dos procesos se ejecutan dentro del mismo contenedor de Docker.

  • path_to_pipe: Ruta de acceso del archivo en tu entorno local. Por ejemplo, /user/local/Desktop/
  • name_of_pipe: Nombre de la canalización que proporcionas. Por ejemplo, my-football-game
$ export PIPE_NAME=/path_to_pipe/name_of_pipe
$ mkfifo $PIPE_NAME

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

Paso 2: Ejecuta el proxy de transferencia AIStreamer

Estos ejemplos de C++, disponibles para tu uso, incluyen un objeto binario único compatible con todas las funciones. Para compilar los ejemplos, sigue estas instrucciones de compilación.

En el siguiente ejemplo, se muestra cómo usar el objeto binario desde la línea de comandos.

$ 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 la ruta de acceso al archivo JSON que contiene la clave de tu cuenta de servicio.

Puedes encontrar un archivo de configuración de ejemplo $CONFIG en github.

Asegúrate de configurar la marca de tiempo de espera correcta en la línea de comandos. Si necesitas transmitir 1 hora de video, el valor de tiempo de espera debe ser de, al menos, 3,600 segundos.

Paso 3: Ejecuta la canalización de GStreamer

GStreamer admite varios protocolos de transmisión en vivo, entre los que se incluyen los siguientes:

  • HTTP Live Streaming (HLS)

  • Protocolo de transmisión en tiempo real (RTSP)

  • Protocolo en tiempo real (RTP)

  • Protocolo de mensajería en tiempo real (RTMP)

  • WebRTC

  • Transmisión desde Webcam

La API de Video Intelligence usa la canalización de GStreamer para convertir estos protocolos de transmisión en vivo en una transmisión de video decodificable y escribe la transmisión en la canalización con nombre creada en el paso 1.

En los siguientes ejemplos, se demuestra cómo usar la biblioteca de transmisión en vivo con los protocolos HLS, RTSP y 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

Protocolo de transmisión en tiempo real (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

Protocolo de mensajería en tiempo real (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

Compila instrucciones

El ejemplo de objeto binario se compila con Bazel. También se proporciona un ejemplo de Docker que tiene configuradas todas las dependencias de compilación. Puedes encontrar el objeto binario streaming_client_main compilado en el directorio $BIN_DIR de la imagen de Docker.

Para obtener más información acerca de cómo usar Docker, consulta Usa Docker y Kubernetes.

Control de flujo

El servidor de la API de transmisión de Video Intelligence tiene control de flujo inherente. En los siguientes dos casos, las solicitudes StreamingAnnotateVideoRequest se rechazan y las conexiones de transmisión de gRPC se detienen de inmediato:

  • El cliente de transferencia de AIStreamer envía solicitudes a los servidores de Google con demasiada frecuencia.

  • El cliente de transferencia de AIStreamer envía demasiados datos a los servidores de Google (más de 20 Mbytes por segundo).

Visualizador

El código de visualizador que se proporciona en AIStreamer solo se debe considerar como un ejemplo de código. El visualizador puede no ser compatible con el entorno local del usuario. Los usuarios de AIStreamer no deben confiar en el código del cliente para visualizar los resultados de la anotación.