Python Gstreamer消息从视频源(网络摄像头)发出新帧信号
我正在尝试使用gstreamer将网络摄像头中的流保存为一系列图像。到目前为止,我已经编写了这段代码Python Gstreamer消息从视频源(网络摄像头)发出新帧信号,python,gstreamer,v4l2,Python,Gstreamer,V4l2,我正在尝试使用gstreamer将网络摄像头中的流保存为一系列图像。到目前为止,我已经编写了这段代码 #!/usr/bin/python import sys, os import pygtk, gtk, gobject import pygst pygst.require("0.10") import gst def __init__(self): #.... # Code to create a gtk Window #.... self
#!/usr/bin/python
import sys, os
import pygtk, gtk, gobject
import pygst
pygst.require("0.10")
import gst
def __init__(self):
#....
# Code to create a gtk Window
#....
self.player = gst.Pipeline("player")
source = gst.element_factory_make("v4l2src", "video-source")
sink = gst.element_factory_make("xvimagesink", "video-output")
caps = gst.Caps("video/x-raw-yuv, width=640, height=480")
filter = gst.element_factory_make("capsfilter", "filter")
filter.set_property("caps", caps)
self.player.add(source, filter, sink)
gst.element_link_many(source, filter, sink)
在此之后,我尝试通过总线创建一个信号,以侦听来自源或接收器的任何消息,以指示已发送或接收到新帧,从而可以保存它
bus = self.player.get_bus()
bus.add_signal_watch()
bus.connect("message::any", self.save_file,"Save file")
其中save_file是我的回调,我想在这里保存文件
def save_file(self, bus, msg):
print "SAVED A NEW FILE"
我有两个问题
Gstreamer总线不打算用于此目的。放在那个里的消息表示一些特殊事件,比如流结束、元素状态改变等等。流经元素的缓冲区(图像)通常不会在总线上生成任何消息 你可以考虑几种可能性:
- 将“tee”元素置于videosink之前,并将“multifilesink”与videosink并行连接(您可能希望看到一些图像编码器,如pngenc或jpegenc,并将其中一个放在multifilesink之前)
- 像以前一样,但是使用“appsink”,它允许您处理缓冲区并对其执行任何操作
- 如果您想切换倾销,请考虑使用“阀门”元素
您可能希望在您的附加接收器上设置“同步”属性为false(这会导致缓冲区在不同步到时钟的情况下尽快被卸载)。考虑在TEE之后添加一些队列(如果在就绪-暂停过渡期间没有出现死锁).
我不确定多年后我的回答是否对你有用。但希望它对其他人有用 要接收已接收缓冲区的消息,可以使用gstreamer 可能是类似的:def make_pipeline(self):
CLI2 = [
'v4l2src ! video/x-raw,format=RGB,width=640,height=480,framerate=30/1 ! ',
'videoconvert ! x264enc bitrate=128 ! mpegtsmux name="mux" ! hlssink name="sink"',
]
gcmd = ''.join(CLI2)
self.pipeline = Gst.parse_launch(gcmd)
self.hlssink = self.pipeline.get_by_name("sink")
self.hlssink.set_property("target-duration",2)
self.hlssink_pad = self.hlssink.get_static_pad("sink")
probe_id = self.hlssink_pad.add_probe(Gst.PadProbeType.EVENT_UPSTREAM,probe_callback)
然后,探测回调函数可以是:
def probe_callback(hlssink_pad,info):
info_event = info.get_event()
info_structure = info_event.get_structure()
do_something_with_this_info
return Gst.PadProbeReturn.PASS
因此,每当源板或接收器板上发生事件时,就会在主线程中调用探测回调函数
希望这有帮助