![](/img/trans.png)
[英]How to stream pc webcam with rtsp and GStreamer on python
[英]Python Gstreamer record RTSP stream to file without command line
我在 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(流结束)标志。
任何帮助或澄清将不胜感激。 谢谢!
在 MP4 文件写入的情况下,您不能简单地停止管道。 如果您这样做,将不会写入 MP4 文件的重要部分。 这使文件无法播放。
相反,您需要将流信号的结尾“注入”到管道并等待该信号在管道总线上报告回。
请参阅http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/chapter-bus.html作为开始。
这就是 gst-launch-1.0 的“-e”选项所做的。
不过,文件大小没有增加是令人担忧的。 它仍然应该写入文件。
在设置 null 之前,您需要向管道发送一个 eos,然后优雅地停止管道....否则 mp4 容器将被损坏....您可以使用:
pipeline.send_event(Gst.Event.new_eos())
发送 eos 信号
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.