我试图理解视频流的概念,当我用谷歌搜索时,我遇到了不同的术语, 根据我的理解(如果我错了,请纠正我),当我们想要流式传输视频时,首先我们需要一个连接到 Jeston 或树莓派的摄像头,然后我们需要一个编码器,然后是一个链接,然后是一个解码器。解码器和编码器的作用是什么? 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 服务器。 它支持启动 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`
./test-launch "( videotestsrc ! x264enc ! rtph264pay name=pay0 pt=96 )"
并像这样启动客户端:
vlc rtsp://127.0.0.1:8554/test
test-launch.c