将gst-launch命令转换为Python程序
我该如何在Python程序中使用PyGST模块来实现以下的 gst-launch
命令呢?
gst-launch-0.10 v4l2src ! \
'video/x-raw-yuv,width=640,height=480,framerate=30/1' ! \
tee name=t_vid ! \
queue ! \
videoflip method=horizontal-flip ! \
xvimagesink sync=false \
t_vid. ! \
queue ! \
videorate ! \
'video/x-raw-yuv,framerate=30/1' \
! queue ! \
mux. \
alsasrc ! \
audio/x-raw-int,rate=48000,channels=2,depth=16 ! \
queue ! \
audioconvert ! \
queue ! \
mux. avimux name=mux ! \
filesink location=me_dancing_funny.avi
2 个回答
1
看看我对gst
模块的封装: https://github.com/vmlaker/gstwrap
注意,分支和混合是通过仔细连接各个元素来定义的。你具体的管道是:
from gstwrap import Element, Pipeline
ee = (
# From src to sink [0:5]
Element('v4l2src'),
Element('capsfilter', [('caps','video/x-raw-yuv,framerate=30/1,width=640,height=360')]),
Element('tee', [('name', 't_vid')]),
Element('queue'),
Element('videoflip', [('method', 'horizontal-flip')]),
Element('xvimagesink', [('sync', 'false')]),
# Branch 1 [6:9]
Element('queue'),
Element('videorate'),
Element('capsfilter', [('caps', 'video/x-raw-yuv,framerate=30/1')]),
Element('queue'),
# Branch 2 [10:15]
Element('alsasrc'),
Element('capsfilter', [('caps', 'audio/x-raw-int,rate=48000,channels=2,depth=16')]),
Element('queue'),
Element('audioconvert'),
Element('queue'),
# Muxing
Element('avimux', [('name', 'mux')]),
Element('filesink', [('location', 'me_dancing_funny.avi')]),
)
pipe = Pipeline()
for index in range(len(ee)):
pipe.add(ee[index])
ee[0].link(ee[1])
ee[1].link(ee[2])
ee[2].link(ee[3])
ee[3].link(ee[4])
ee[4].link(ee[5])
# Branch 1
ee[2].link(ee[6])
ee[6].link(ee[7])
ee[7].link(ee[8])
ee[8].link(ee[9])
# Branch 2
ee[10].link(ee[11])
ee[11].link(ee[12])
ee[12].link(ee[13])
ee[13].link(ee[14])
ee[14].link(ee[15])
# Muxing
ee[9].link(ee[15])
ee[15].link(ee[16])
print(pipe)
pipe.start()
raw_input('Hit <enter> to stop.')
2
你不能直接把“gst-launch的语法”转换成“python的语法”。
你可以选择手动(也就是用代码)创建一个相同的管道,使用像gst.element_factory_make()这样的函数,然后自己把所有的部分连接起来。
或者你可以使用类似下面的方式:
pipeline = gst.parse_launch("v4l2src ! ..... ")
在你的管道中,你可以给每个元素起个名字,比如用v4l2src name=mysrc ! ...,然后你可以通过下面的方式从管道中获取这个元素:
src = pipeline.get_by_name('mysrc')
接着你可以设置它的一些属性,比如:
src.set_property("location", filepath)