如何流式传输实时视频

Video Intelligence Streaming API 支持标准实时流式传输协议,如 RTSP、RTMP 和 HLS。AIStreamer 提取流水线充当流式传输代理,从实时流式传输协议转换为双向流式传输 gRPC 连接。

为了支持实时流式传输协议,Video Intelligence API 使用 GStreamer 开放式媒体框架。

第 1 步:创建已命名的管道

创建已命名的管道是为了在 GStreamer 和 AIStreamer 提取代理之间通信。这两个进程在同一个 Docker 容器内运行。

  • path_to_pipe:本地环境中的文件路径。例如 /user/local/Desktop/
  • name_of_pipe:您提供的管道名称。例如 my-football-game
$ export PIPE_NAME=/path_to_pipe/name_of_pipe
$ mkfifo $PIPE_NAME

示例:/user/local/Desktop/my-football-game

第 2 步:运行 AIStreamer 提取代理

这些 C++ 示例可供您使用,其中包含支持所有功能的单个二进制文件。要构建这些示例,请按照这些构建说明进行操作。

以下示例显示了如何从命令行使用该二进制文件。

$ 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 用于指定包含服务帐号密钥的 JSON 文件的文件路径。

您可以在 github 中找到示例配置文件 $CONFIG

请务必在命令行中设置正确的超时标志。如果您需要流式传输 1 小时的视频,超时值应至少为 3600 秒。

第 3 步:运行 GStreamer 流水线

GStreamer 支持多种实时流式传输协议,包括但不限于以下协议:

  • HTTP Live Streaming (HLS)

  • 实时流式传输协议 (RTSP)

  • 实时协议 (RTP)

  • 实时消息传递协议 (RTMP)

  • WebRTC

  • 从网络摄像头流式传输

Video Intelligence API 使用 GStreamer 流水线从这些实时流式传输协议转换为可解码的视频串流,并将该串流写入第 1 步中创建的已命名管道。

以下示例演示了如何通过 HLS、RTSP 和 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

实时流式传输协议 (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

实时消息传递协议 (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

构建说明

二进制文件示例是使用 Bazel 构建的。Google 还提供了已配置所有构建依赖项的 Docker 示例。您可以在 Docker 映像的 $BIN_DIR 目录中找到已编译的 streaming_client_main 二进制文件。

如需了解有关如何使用 Docker 的更多信息,请参阅使用 Docker 和 Kubernetes

流控制

Video Intelligence Streaming API 服务器具备固有的流控制功能。在以下两种情况下,StreamingAnnotateVideoRequest 请求会被拒绝,并且 gRPC 流式连接会立即停止:

  • AIStreamer 提取客户端过于频繁地向 Google 服务器发送请求时

  • AIStreamer 提取客户端向 Google 服务器发送过多数据(每秒超过 20MB)时。

可视化工具

AIStreamer 中提供的 Visualizer 代码应仅被视为代码示例。Visualizer 可能与用户的本地环境兼容。AIStreamer 用户不应依赖客户端代码来可视化注释结果。