我想问一些技巧,如何从监视IP摄像头保存rtsp 流到GStreamer文件。我发现了这个:
gst-launch -e rtspsrc location="rtsp://(my-camera-stream-address)" ! decodebin ! x264enc ! mp4mux ! filesink location=file.mp4
它工作良好,但它有一个非常高的CPU消耗。我确信它会解码我的原始流并将其编码到另一个流中。
请您告诉我,如何做到这一点,而不需要重新编码-如何只是捕获实时流并保存到容器?
发布于 2016-08-08 11:08:44
那么,首先检查一下流的类型。
方法1
使用标识调试元素检查缓冲区:
gst-launch-1.0 rtspsrc location=rtsp://mpv.cdn3.bigCDN.com:554/bigCDN/definst/mp4:bigbuckbunnyiphone_400.mp4 name=r ! application/x-rtp,media=video ! identity silent=false ! fakesink -v并检查缓冲区的信息,这些信息应该是形式的:
/GstPipeline:pipeline0/GstRTSPSrc:r.GstGhostPad:recv_rtp_src__2072847348_96.GstProxyPad:proxypad9: caps =“application/x\,\media\=(String)音频\,\ payload\=(int)96\,\时钟速率\=(Int)48000\,\编码-名称\=(字符串)MPEG4 4-泛型\,\编码-params\=(String)2\,\profile-level-id=(String)1\,\mode\=(String)AAC\,\ config\=(string)119008c400002000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\,\ a-sdplang\=(string)en\,\ ssrc\=(uint)2072847348\,\sizelength\=-base\=(Uint)0\,\ seqnum-base\=(uint)1\,\npt start\=(Guint64)0,\npt-停止\=(Guint64)596458000000播放速度\=(双)1\\播放比例尺\=(双)1
注意编码名称..。这指向在mp4中默认使用的aac。同样适用于视频搜索应用程序/x、media=video类型的缓冲区。对我来说,它又是mp4泛型-- h264。
方法2
更简单的方法是使用uridecodebin并转储点文件,查看它是如何构造管道的,并复制相应的元素:
GST_DEBUG_DUMP_DOT_DIR=`pwd` gst-launch-1.0 uridecodebin uri=rtsp://mpv.cdn3.bigCDN.com:554/bigCDN/definst/mp4:bigbuckbunnyiphone_400.mp4 ! fakesink这将生成具有.dot扩展名的文件--获取PAUSE_PLAYING文件,并使其成为dot -T png 0.0blabla.dot -o blabla.png的图片。检查rtpsometginfdepay后的元素。
对于所有的信息,您可以构建类似的管道:
gst-launch-1.0 -e mp4mux name=m ! filesink location=bla.mp4 rtspsrc location=rtsp://mpv.cdn3.bigCDN.com:554/bigCDN/definst/mp4:bigbuckbunnyiphone_400.mp4 name=r r. ! "application/x-rtp,media=video" ! rtph264depay ! h264parse ! m. r. ! "application/x-rtp,media=audio" ! rtpmp4gdepay ! aacparse ! m.请记住,您可以在gst启动开始时创建元素,但稍后使用它们(就像我对mp4mux所做的那样)。
HTH
https://stackoverflow.com/questions/38825194
复制相似问题