带有 CAM8200-U 的两个 RIoT 板之间通过 UDP 的 Gstreamer

Gstreamer over UDP between two RIoT boards with CAM8200-U

我正在尝试使用 gst-launch 捕捉视频、流式传输并将其保存在第二块板上。然后我想通过在PC上播放视频文件来验证流是否良好。

CAM8200-U -> RIoT_1------Stream_Ethernet-----RIoT_2 - Save file on RIoT_2.

两块板都是运行Linux Yocto v3.10.17

首先,我遵循了本教程(我使用的是 gst-launch-0.10 而不是 1.0,因为那是板上的版本):http://www.z25.org/static/rd/videostreaming_intro_plab/

发件人:

gst-launch-0.10 videotestsrc ! jpegenc ! rtpjpegpay ! udpsink host=127.0.0.1 port=5200

接收者:

gst-launch-0.10 udpsrc port=5200 ! application/x-rtp, encoding-name=JPEG,payload=26 ! rtpjpegdepay ! jpegdec ! autovideosink

这个例子在看板上完美运行!不是真正使用相机,但仍然是一个很好的起点。但是,如果我将 autovideosink 更改为 filesink location=xxx.format (.mp4 .mkv .avi),则文件无法播放。

问题1:你知道如何把这个流保存到一个文件中,以后可以播放吗?

经过一番搜索后,我能够使用以下行流式传输和保存 videotestsrc

发件人:

gst-launch-0.10 videotestsrc ! ffmpegcolorspace ! jpegenc ! udpsink host=192.168.1.103 port=5200

接收者:

gst-launch-0.10 udpsrc port=5200 ! jpegdec ! ffmpegcolorspace ! avimux ! filesink location=/home/root/movie.avi

但是,将 videotestsrc 更改为 v4l2src device=/dev/video0 会得到一个空文件。

问题 2:您是否知道为什么它适用于 videotestsrc 而不适用于相机?

然后我在 YouTube 上找到了 element14 给出的这个例子:https://www.youtube.com/watch?v=mRbckLppmKs 我可以用它从相机中获取视频并保存。这是行:

gst-launch-0.10 v4l2src device=/dev/video0 num-buffers=-1 ! 'video/x-raw-yuv,width=1024,height=768' ! queue ! ffmpegcolorspace ! vpuenc codec=0 ! matroskamux ! filesink location=output.mkv sync=false

我尝试了多种方法来将这条线串流并保存在另一端,但都没有成功。

问题 3:您知道我可以流式传输和保存来自该摄像机的视频的正确方法吗?

要使用 v4l2src 捕获相机,您必须为其提供正确的设备。
您可能在这里使用了错误的设备。 CAM8200-U是USB摄像头,所以不太可能/dev/video0

对于 USB 相机,了解其设备的最简单方法是拔下并重新插入。新出现的(通常是最后一个)视频设备是您的相机设备。假设设备是/dev/video10,你命令录制文件是

gst-launch-0.10 v4l2src device=/dev/video10 num-buffers=-1 ! 'video/x-raw-yuv,width=1024,height=768'!队列 ! ffmpeg 色彩空间! vpuenc 编解码器=0! matroskamux !文件接收器位置=output.mkv

(记得查看相机说明书确认是否支持1024x768分辨率)

发送流的命令是

gst-launch-0.10 v4l2src device=/dev/video10 num-buffers=-1 ! 'video/x-raw-yuv,width=1024,height=768' ! queue ! ffmpegcolorspace ! jpegenc ! udpsink host=192.168.1.103 port=5200

回答我的问题并回复玛蒂尔达:

谢谢,玛蒂尔达!实际上,由于某种原因它总是在 video0 上。我的主要问题是让流工作,或者非常详细地说明如何 encrypt/decrypt/use 正确的上限,所以它工作。

我能够使用以下选项从 RIoT 流式传输和保存到 RIoT:

发件人:

gst-launch-0.10 v4l2src device=/dev/video0 ! 'video/x-raw-yuv,width=1024,height=768' ! ffmpegcolorspace ! vpuenc codec=5 ! rtph263pay ! udpsink host=192.168.1.104 port=5200

接收者:

gst-launch-0.10 udpsrc port=5200 ! application/x-rtp, media=video, payload=96 ! rtph263depay ! vpudec ! matroskamux ! filesink location=video3.mkv

奇怪的是,如果我使用 avimux 而不是 matroskamux,视频会以 5 倍速播放。不知道为什么,但在这一点上并不重要。此外,这些选项在 RIoTboard 和 PC 上不起作用,只是因为 Ubuntu 中没有 vpudec 选项(或者至少不知道如何添加它)。也许使用不同的方式来解密 H.263 会起作用。

谢谢你的帮助!