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

14

我需要通过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之间选择,请解释一下为什么选择哪个。


2
@downvote:我认为这个问题除了标题之外没有任何问题。 @Juster:1)您可以尝试完全不使用h264parse。2)流是否能够播放? - Victor Sergienko
3个回答

18

您需要添加 -e 标志(流的结尾),以便 mp4mux 可以完成文件,否则您将得到损坏的不可播放的文件。

 gst-launch -e rtspsrc location=url ! decodebin ! x264enc ! mp4mux ! filesink location=file.mp4

在我的情况下,这个命令生成了可播放的文件,但所有帧看起来都像第一帧。就好像视频被冻结了一样。 - αλεχολυτ

11
如果您的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

如果您想进行类似于修改宽度、高度(使用videoscale)、颜色空间(使用videoconvert)、帧率(使用capsfilter)等操作,应该基于video/x-raw类型的能力进行解码,从video/x-h264解码到video/x-raw。
修改后,应重新编码,然后再链接到mux元素(如mp4mux、mpegtsmux、matroskamux等)。
看起来您不确定何时使用视频解码器。这里简单分享一些使用视频编解码器的经验:
  1. 如果源已被编码,并且我想使用相同的编码将其写入容器,则管道将为:
  2. src ! ... ! mux ! filesink

  3. 如果源已被编码,并且我想使用不同的编码将其写入容器,或者我想使用videosink播放,则管道将为:
  4. src ! decode ! ... ! encode ! mux ! filesink src ! decode ! ... ! videosink

  5. 如果源没有被编码(如videotestsrc),并且我想将其写入容器,则管道为:
  6. src ! encode ! mux ! filesink

注意:进行编解码会消耗大量CPU资源!因此,如果您不需要进行编解码工作,请勿这样做。
您可以使用方便的工具gst-inspect-1.0检查src、sink、mux、demux、enc、dec、convert等元素。例如:
$ gst-inspect-1.0 | grep mux

显示所有可用的复用元素。

为什么需要h264parse?解包器应该已经是h264的了,难道mp4mux不能读取吗?(请注意,当我将其删除时,我的mp4文件只有500个字节,且大小不会增长) - PeterT
1
mp4mux无法读取原始的h264数据,其中流格式为“byte-stream”(原始)。另一种解决方案是使用编码器和解码器进行管道传输,但CPU成本会更高。请参见解析器和编码器之间的区别。您还可以参考rtph264depaymp4mux和h264parse的* sink src *。 - sheucm

8
第二个命令看起来是正确的。原始的h264视频数据有两个特征:对齐和流格式,这些特征可能会有所不同。h264parse可以将h264数据转换为不同h264相关GStreamer元素所需的形式。
avdec_h264是一个解码器元素。您不需要解码数据,因为显然没有将其显示出来。您正在将来自RTSP流的编码h264数据放入mp4容器文件中。
如果文件无法播放,则应检查流是否良好,或尝试其他媒体播放器并查看它们是否可用(mplayer、Media Player、Quicktime等)。
您还可以尝试使用“matroskamux”元素混合到matroska容器文件中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接