视频流、RTSP 和 GStream

问题描述 投票:0回答:1

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

video-streaming gstreamer rtsp
1个回答
2
投票

让我们弄清楚术语。

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 服务器

。 它支持启动 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论坛以获取示例。 (例如
这个

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.