Python Gstreamer不使用命令行将RTSP流记录到文件

Python Gstreamer不使用命令行将RTSP流记录到文件,python,gstreamer,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

我正在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文件的重要部分。这会使文件无法播放

相反,您需要向管道“注入”流结束信号,并等待该信号在管道总线上报告回来

先看看吧

这就是gst-launch-1.0的“-e”选项所做的


不过,文件大小没有增加令人担忧。尽管如此,它还是应该写入文件。

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

相反,您需要向管道“注入”流结束信号,并等待该信号在管道总线上报告回来

先看看吧

这就是gst-launch-1.0的“-e”选项所做的


不过,文件大小没有增加令人担忧。尽管如此,它还是应该写入文件。

非常感谢您的回复,非常感谢。我现在很好奇,也很好奇为什么它没有录制任何东西。我在没有-e选项的情况下测试了命令行管道,它仍然被记录,但是生成的文件在VLC中不会显示任何内容。我已经看过gstreamer总线好几次了,但是我看到的大多数教程和示例仅仅展示了如何处理来自管道的各种消息。我确实在文档中找到了gst\u event\u new\u eos(),因此我现在将尝试找出如何“注入”它。关于为什么即使没有EOS处理,文件大小也不会改变,你有什么想法吗?有一些提示,但请注意,我觉得自己是C阵营的一员,对python了解不多,所以我希望你能根据自己的需要进行翻译。检查gst-parse-launch(),以简化管道生成。它看起来就像gst-launch-1.0的命令行。这将大大降低您的代码行数。gst_元素_send_event(管道,gst_event_new_eos())用于将eos发送到管道。我强烈建议您在构建管道时检查错误代码。可能有问题,您很可能会发现。当然,如果启动管道后出现错误,总线处理程序也会在此处提供帮助。文件位置字符串前是否有一个游离的“r”?好的,谢谢您的提示。我将添加总线并检查错误消息。文件位置字符串前的r表示“raw”,因此python将其编码为Unicode,如果没有r,则必须使用双反斜杠等,以便解释器不会尝试编码Unicode转义等。再次感谢所有帮助!非常感谢。今天我将进行测试,看看我能发现什么。非常感谢您的回复,非常感谢。我现在很好奇,也很好奇为什么它没有录制任何东西。我在没有-e选项的情况下测试了命令行管道,它仍然被记录,但是生成的文件在VLC中不会显示任何内容。我已经看过gstreamer总线好几次了,但是我看到的大多数教程和示例仅仅展示了如何处理来自管道的各种消息。我确实在文档中找到了gst\u event\u new\u eos(),因此我现在将尝试找出如何“注入”它。关于为什么即使没有EOS处理,文件大小也不会改变,你有什么想法吗?有一些提示,但请注意,我觉得自己是C阵营的一员,对python了解不多,所以我希望你能根据自己的需要进行翻译。检查gst-parse-launch(),以简化管道生成。它看起来就像gst-launch-1.0的命令行。这将大大降低您的代码行数。gst_元素_send_event(管道,gst_event_new_eos())用于将eos发送到管道。我强烈建议您在构建管道时检查错误代码。可能有问题,您很可能会发现。当然,如果启动管道后出现错误,总线处理程序也会在此处提供帮助。文件位置字符串前是否有一个游离的“r”?好的,谢谢您的提示。我将添加总线并检查错误消息。文件位置字符串前的r表示“raw”,因此python将其编码为Unicode,如果没有r,则必须使用双反斜杠等,以便解释器不会尝试编码Unicode转义等。再次感谢所有帮助!非常感谢。我今天将进行测试,看看能发现什么。