我需要通过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之间做出选择,你能解释一下原因吗?
答案 0 :(得分:14)
您需要添加-e标志(流结束),以便mp4mux可以最终确定文件,否则您将损坏不可播放的文件。
gst-launch -e rtspsrc location=url ! decodebin ! x264enc ! mp4mux ! filesink location=file.mp4
答案 1 :(得分:7)
第二个命令看起来正确。原始h264视频数据有点棘手,因为它有两个特征 - “对齐”和“流格式”,它们可以变化。 h264parse可以将h264数据转换为不同h264相关GStreamer元素所需的形式。
avdec_h264是一个解码器元素。您不想解码数据,因为您显然没有显示它。您将来自RTSP流的已编码h264数据放入mp4容器文件中。
如果文件没有播放,你应检查流是否正常,或者尝试其他媒体播放器,看看它们是否有效(mplayer,Media Player,Quicktime等)。
您还可以尝试使用“matroskamux”元素复用到matroska容器文件中。
答案 2 :(得分:3)
如果您的rtspsrc流已使用H264进行编码,则只需直接写入mp4容器即可,而无需进行编解码处理。
这是我的gst-launch-1.0命令,用于将rtsp录制到mp4:
$ gst-launch-1.0 -e rtspsrc location=rtsp://admin:pass@192.168.85.7/rtsph2641080p protocols=tcp ! rtph264depay ! h264parse ! mp4mux ! filesink location=~/camera.mp4
如果要执行一些操作,如修改宽度,高度(使用视频缩放),色彩空间(使用视频转换),帧速率(使用capsfilter)等,这些操作应基于视频/ x原始类型的功能进行,从video / x-h264解码为video / x-raw。
而且,在修改之后,您应该在链接到mux元素(例如mp4mux,mpegtsmux,matroskamux等)之前再次进行编码。
似乎您不确定何时使用视频解码器。这里只是分享一些使用视频编解码器的经验:
如果源已被编码,并且我想使用相同的编码写入容器,则管道将如下所示:
src ! ... ! mux ! filesink
如果源已经编码,并且我想使用不同的编码写入容器,或者我想使用videosink,则管道将如下所示:
src ! decode ! ... ! encode ! mux ! filesink
src ! decode ! ... ! videosink
如果未对源进行编码(如videotestsrc),并且我想写入容器,则管道将如下所示:
src ! encode ! mux ! filesink
注意:执行编解码器时,它会消耗大量cpu资源!因此,如果您不需要进行编解码器工作,请不要这样做。
您可以使用便捷的工具 gst-inspect-1.0 检出src,sink,mux,demux,enc,dec,convert等元素。例如:
$ gst-inspect-1.0 | grep mux
显示所有可用的多路复用器元素。