[英]How to save a RTSP video stream to MP4 file via gstreamer?
我需要通过RTSP从我的相机获取视频流并将其保存到文件中。 所有这些都需要通过gstreamer来完成。
经过一些谷歌搜索,我尝试了以下内容:
gst-launch-1.0 rtspsrc location=rtsp://192.168.1.184/live2.sdp ! queue ! rtph264depay ! avdec_h264 ! mp4mux ! filesink location=result3.mp4
但它给出了错误:“错误的管道:无法将avdec_h264-0链接到mp4mux0”
gst-launch-1.0 rtspsrc location=rtsp://192.168.1.184/live2.sdp ! queue ! rtph264depay ! h264parse ! mp4mux ! filesink location=result3.mp4
它开始工作,但结果文件无法通过VLC播放。
什么是正确的命令? 如果你在h264parse和avdec_h264之间做出选择,你能解释一下原因吗?
您需要添加-e标志(流结束),以便mp4mux可以最终确定文件,否则您将损坏不可播放的文件。
gst-launch -e rtspsrc location=url ! decodebin ! x264enc ! mp4mux ! filesink location=file.mp4
第二个命令看起来正确。 原始h264视频数据有点棘手,因为它有两个特征 - “对齐”和“流格式”,它们可以变化。 h264parse可以将h264数据转换为不同h264相关GStreamer元素所需的形式。
avdec_h264是一个解码器元素。 您不想解码数据,因为您显然没有显示它。 您将来自RTSP流的已编码h264数据放入mp4容器文件中。
如果文件没有播放,您应检查流是否正常,或尝试其他媒体播放器,看看它们是否有效(mplayer,Media Player,Quicktime等等)。
您还可以使用“matroskamux”元素尝试多路复用到matroska容器文件中。
如果你的rtspsrc流已经在H264中编码,只需直接写入mp4容器,而不是编写代码。
这是我用于将rtsp录制到mp4的gst-launch-1.0命令:
$ gst-launch-1.0 -e rtspsrc location=rtsp://admin:pass@192.168.85.7/rtsph2641080p protocols=tcp ! rtph264depay ! h264parse ! mp4mux ! filesink location=~/camera.mp4
如果你想做一些事情,比如修改宽度,高度(使用视频),颜色空间(使用视频转换),帧速率(使用封顶滤镜)等,这应该基于视频/ x-raw类型的功能,你应该从视频解码/ x-h264到video / x-raw。
并且,在修改之后,您应该在链接到mux元素之前再次编码(如mp4mux,mpegtsmux,matroskamux,...)。
好像你不确定何时使用视频解码器。 这里只是分享一些使用视频编解码器的经验:
如果source已经编码,并且我想用相同的编码写入容器,那么管道将会:
src ! ... ! mux ! filesink
如果source已被编码,并且我想用不同的编码写入容器,或者我想使用videosink,那么管道将会:
src ! decode ! ... ! encode ! mux ! filesink src ! decode ! ... ! videosink
如果source尚未编码(如videotestsrc),并且我想写入容器,那么管道将会:
src ! encode ! mux ! filesink
注意:执行编解码器时,它需要很高的CPU资源! 因此,如果您不需要执行编解码器工作,请不要这样做。
您可以使用方便的工具gst-inspect-1.0查看src,sink,mux,demux,enc,dec,convert,...等元素。 例如:
$ gst-inspect-1.0 | grep mux
显示所有可用的mux元素。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.