gstreamer边查看流边录制成文件

1,684 阅读1分钟

为建立中文知识库加块砖        ——中科大胡不归

问题描述

使用gstreamer,如何查看并同时录制一个来自摄像头的UDP推流?

解决办法

关键代码

gst-launch-1.0 udpsrc ! application/x-rtp ! rtpjitterbuffer ! rtph264depay ! decodebin ! tee name=t \
! queue leaky=1 !  clockoverlay ! autovideosink sync=false t. ! queue ! videoconvert \
! x264enc ! mpegtsmux ! filesink location=e:/h1.mp4

方法分析

  • application/x-rtp 两个element必须通过pad才能连接起来,pad拥有当前element能处理数据类型的能力(capabilities),会在连接时通过比较src pad和sink pad中所支持的能力,来选择最恰当的数据类型用于传输,如果element不支持,程序会直接退出。在element通过pad连接成功后,数据会从上一个element的src pad传到下一个element的sink pad然后进行处理。 当element支持多种数据处理能力时,我们可以通过Cap来指定数据类型。 例如,下面的命令通过Cap指定了视频的宽高,videotestsrc会根据指定的宽高产生相应数据:
gst-launch-1.0 videotestsrc ! "video/x-raw,width=1280,height=720" ! autovideosink
  • rtph264depay UDP播放需要根据发送端数据源封装格式来决定采用哪些Gstreamer插件,如果进行了RTP封装,则需要先用rtph264depay进行解包,如果包含自定义帧头的情况,应该编程对帧头进行处理,不然会显示异常,比如部分花屏现象。

  • tee 使用tee命令分支管道数据。

  • queue 可以理解为gstreamer的线程

参考文章

  1. GStreamer同时录制和查看流

  2. gstreamer应用笔记

  3. 什么是Gstreamer?

  4. Abdis-Dev/gstreamer