我正在使用gst和python开发视频聊天。 在哪里,我想查看最终用户的网络摄像头,还想在一个gtk窗口中查看我自己的网络摄像头(类似于移情视频聊天)。
为此,我使用了gst.Tee对象并创建了2个队列,一个将结果链接到本地gtk窗口,第二个队列将相同的视频流链接到会话对象。
gst.Tee完成了这项任务,但也降低了视频聊天的速度,而视频比音频更晚。 (我在音频会话中使用了不同的流)
这里是代码段:
self.pipeline = gst.Pipeline()
bus = self.pipeline.get_bus()
bus.add_signal_watch()
bus.connect('message', self._on_gst_message)
self.src_bin = gst.element_factory_make("autovideosrc", "src")
autovideosinkLocal = gst.element_factory_make("autovideosink", "autovideosinkLocal")
tee = gst.element_factory_make('tee', "tee")
queueLocal = gst.element_factory_make("queue", "queueLocal")
queueSend = gst.element_factory_make("queue", "queueSend")
self.pipeline.add(self.src_bin, tee, queueLocal, autovideosinkLocal, queueSend)
gst.element_link_many(self.src_bin, tee)
tee.link(queueLocal)
queueLocal.link(autovideosinkLocal)
tee.link(queueSend)
queueSend.get_pad('src').link(self.p2psession.get_property('sink-pad'))
self.pipeline.set_state(gst.STATE_PLAYING)
如何加快视频聊天速度(例如,如果我使用单个接收器并只显示接受者的视频,那么效果很好)?
有没有其他方法可以做同样的事情?
谢谢!
答案 0 :(得分:0)
我一直在回答,但由于没有其他人权衡过,我会对它进行一次拍摄。
我不确定这是否会与网络摄像头相关(尽管可能会这样),但您可以在PyGTK中为两个屏幕创建两个绘图区域(gtk.DrawingArea)。然后,您可以将视频连接到那些视频。
我在播放视频的代码中做了类似的事情。这可能需要你创建两个单独的接收器,但坦率地说,我不确定。 (如果有人可以进一步扩展这个想法,请随时在评论中这样做。)
这是我现在正在使用的一段代码(取自def __ init __。我在Ubuntu处理它的一个小故障(我认为它与JACK有关),但我很确定这是特定于计算机的。注意,我有一个预定义的路径。
def __init__(self):
def on_message(bus, message):
if message.type == gst.MESSAGE_EOS:
# End of Stream
player.set_state(gst.STATE_NULL)
elif message.type == gst.MESSAGE_ERROR:
player.set_state(gst.STATE_NULL)
(err, debug) = message.parse_error()
print "Error: %s" % err, debug
def on_sync_message(bus, message):
if message.structure is None:
return False
if message.structure.get_name() == "prepare-xwindow-id":
if sys.platform == "win32":
win_id = videowidget.window.handle
else:
win_id = videowidget.window.xid
assert win_id
imagesink = message.src
imagesink.set_property("force-aspect-ratio", True)
imagesink.set_xwindow_id(win_id)
win = gtk.Window()
win.set_resizable(False)
win.set_has_frame(False)
win.set_position(gtk.WIN_POS_CENTER)
fixed = gtk.Fixed()
win.add(fixed)
fixed.show()
videowidget = gtk.DrawingArea()
fixed.put(videowidget, 0, 0)
videowidget.set_size_request(640, 480)
videowidget.show()
# Setup GStreamer
player = gst.element_factory_make("playbin", "MultimediaPlayer")
bus = player.get_bus()
bus.add_signal_watch()
bus.enable_sync_message_emission()
#used to get messages that GStreamer emits
bus.connect("message", on_message)
#used for connecting video to your application
bus.connect("sync-message::element", on_sync_message)
player.set_property("uri", "file://" + os.getcwd() + "/VID/SEQ-GAME-OPEN.ogv")
player.set_state(gst.STATE_PLAYING)
win.show()
希望能帮到你,有些人。