微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

视频流、RTSP 和 GStream

如何解决视频流、RTSP 和 GStream

我试图理解视频流的概念,当我用谷歌搜索时,我遇到了不同的术语, 根据我的理解(如果我错了,请纠正我),当我们想要流式传输视频时,首先我们需要一个连接到 jeston 或 raspBerry pi 的相机,然后我们需要一个编码器,然后是一个链接,然后是一个解码器。解码器和编码器的作用是什么? RTSP 和 Gstreamer 是编码器和解码器吗?为什么我们需要一个 Clint 和一个服务器?

解决方法

让我们弄清楚术语。

Gstreamer 是...

"一个极其强大和通用的框架 创建流媒体应用程序。”

简而言之,Gstreamer 允许您创建非常复杂的媒体管道并在您的终端中运行它们,或者使用 GStramer API(它为您提供更多功能)。
这种管道的一个例子是:
从相机抓取帧 => 降低帧率 => 裁剪 => 调整大小 => 编码为 h.264 => 存储为本地 .mp4 文件

这样的管道可以在终端中创建:

gst-launch-1.0 v4l2src device="/dev/video0" ! \
  videorate ! video/x-raw,framerate=10/1 ! \
  videocrop top=6 left=302 right=198 bottom=9 ! \
  videoscale ! video/x-raw,width=640,height=480 ! \
  x264enc ! h264parse ! matroskamux ! \
  filesink location=/tmp/video.mp4 -e

这让我想到了你的下一个问题: 管道元素 x264enc 是 H.264 编码器。
编码器是一种复杂的机制,可通过(通常)重要因素压缩您的视频,同时略微降低图像质量。
它利用了这样一个事实,即在大多数视频中,连续帧之间没有太大变化,相邻像素之间的单个帧也没有太多变化(想想背景中有白墙的视频)。 因此,编码器仅对更改进行编码!如果您将文件存储到磁盘,这会导致文件非常小,或者如果您通过网络传输文件会减少带宽。

解码器进行反向操作。它可以读取编码文件并将这些(上述)“更改”解码成视频流(类似于原始流)。简单来说,就是解压视频。

RTSP 是一种流媒体协议(众多协议之一),它允许发送诸如播放/暂停之类的命令并接收回视频流。

这意味着,如果您希望从设备流式传输视频,则需要在其上运行 RTSP 服务器。

幸运的是,GStreamer 具有您可以轻松构建的 RTSP server。 它支持启动 gstreamer 视频管道,最终将视频流式传输到客户端。

在我的 Ubuntu 18.04 上 以下脚本编译了一个服务器的玩具示例 (test-launch.c):

wget https://raw.githubusercontent.com/GStreamer/gst-rtsp-server/1.14/examples/test-launch.c
sudo apt-get update && sudo apt-get install libgstrtspserver-1.0-0 libgstrtspserver-1.0-dev
gcc -o test-launch  ./test_launch.c  `pkg-config --cflags --libs gstreamer-rtsp-server-1.0`
  • 这假设您已经安装了 gstreamer(和插件)。
  • 我特意下载了 1.14 (test-launch.c) 版本以匹配我的 gstreamer 版本。

现在你可以像这样启动(玩具)服务器:
./test-launch "( videotestsrc ! x264enc ! rtph264pay name=pay0 pt=96 )"

然后像这样启动客户端:
vlc rtsp://127.0.0.1:8554/test

  • IP 和 PORT 被硬编码在 test-launch.c

顺便说一句,如果您使用的是 jetson,您可以在 Nvidia 论坛中搜索示例。 (例如this

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。