Python Gstreamer在没有命令行的情况下将RTSP流记录到文件中

时间:2015-08-10 17:22:02

标签: python gstreamer

我在Windows 7 Pro上运行python 3.4.3,使用gstreamer 1.4.5,并通过从SourceForge下载的pygi-aio-3.14.0_rev19-setup.exe安装适用的绑定。

我正在尝试从RTSP流中检索视频,并使用python和相应的gstreamer元素将其记录到文件中。

我可以在命令行界面上使用此管道实现此目的:

gst-launch-1.0 -e rtspsrc location=rtsp://10.22.200.70/axis-media/media.amp latency=0 ! queue ! rtph264depay ! h264parse ! mp4mux ! filesink location=test.mp4 sync=false

我试图在python中复制它,但它不起作用,我不确定我缺少或缺少什么。

import time
from gi.repository import GObject, Gst

GObject.threads_init()
Gst.init(None)

pipeline = Gst.Pipeline()

video_source = Gst.ElementFactory.make('rtspsrc', 'source')
video_source.set_property('location', 'rtsp://10.22.200.70/axis-media/media.amp')
video_source.set_property('latency', 0)

video_queue = Gst.ElementFactory.make('queue', 'video_queue')

video_depay = Gst.ElementFactory.make('rtph264depay', 'video_depay')

video_parser = Gst.ElementFactory.make('h264parse', 'video_parser')

video_muxer = Gst.ElementFactory.make('mp4mux', 'video_muxer')

filesink = Gst.ElementFactory.make('filesink', 'sink')
filesink.set_property('location', r'C:\Users\Robocop\Desktop\Video_Recordings\test.mp4')
filesink.set_property('sync', 'false')

pipeline.add(video_source)
pipeline.add(video_queue)
pipeline.add(video_depay)
pipeline.add(video_parser)
pipeline.add(video_muxer)
pipeline.add(filesink)

video_source.link(video_queue)
video_queue.link(video_depay)
video_depay.link(video_parser)
video_parser.link(video_muxer)
video_muxer.link(filesink)

pipeline.set_state(Gst.State.PLAYING)

time.sleep(10)

pipeline.set_state(Gst.State.NULL)

将创建test.mp4文件,但它永远不会记录任何/文件大小永远不会更改。我在最初测试命令行管道时遇到了这个问题,我发现我需要添加-e(流结束)标志。

非常感谢任何帮助或澄清。谢谢!

1 个答案:

答案 0 :(得分:0)

在MP4文件写入的情况下,您不能简单地停止管道。如果您这样做,将不会写入MP4文件的重要部分。这使文件无法播放。

相反,你需要注射"流到管道的信号流结束,并等到该信号在管道总线上报告回来。

首先看http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/chapter-bus.html

这就是" -e"选项是为gst-launch-1.0做的。

虽然文件大小没有增加但是有关。它应该写入文件。