如何通过gstreamer将RTSP视频流保存到MP4文件?

时间:2014-09-15 03:39:39

标签: video video-streaming gstreamer mp4 rtsp

我需要通过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之间做出选择,你能解释一下原因吗?

3 个答案:

答案 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等)之前再次进行编码。

似乎您不确定何时使用视频解码器。这里只是分享一些使用视频编解码器的经验:

  1. 如果源已被编码,并且我想使用相同的编码写入容器,则管道将如下所示:

    src ! ... ! mux ! filesink

  2. 如果源已经编码,并且我想使用不同的编码写入容器,或者我想使用videosink,则管道将如下所示:

    src ! decode ! ... ! encode ! mux ! filesink src ! decode ! ... ! videosink

  3. 如果未对源进行编码(如videotestsrc),并且我想写入容器,则管道将如下所示:

    src ! encode ! mux ! filesink

注意:执行编解码器时,它会消耗大量cpu资源!因此,如果您不需要进行编解码器工作,请不要这样做。

您可以使用便捷的工具 gst-inspect-1.0 检出src,sink,mux,demux,enc,dec,convert等元素。例如:

$ gst-inspect-1.0 | grep mux

显示所有可用的多路复用器元素。