繁体   English   中英

Python Gstreamer 无需命令行即可将 RTSP 流记录到文件中

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM