我在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(流结束)标志。
非常感谢任何帮助或澄清。谢谢!
答案 0 :(得分:0)
在MP4文件写入的情况下,您不能简单地停止管道。如果您这样做,将不会写入MP4文件的重要部分。这使文件无法播放。
相反,你需要注射"流到管道的信号流结束,并等到该信号在管道总线上报告回来。
首先看http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/chapter-bus.html。
这就是" -e"选项是为gst-launch-1.0做的。
虽然文件大小没有增加但是有关。它应该写入文件。