文章目录
gstreamer常用知识总结
1.元件
(1)元件的种类:
源元件、队列元件、解封装元件、解码元件、过滤元件、色彩转换元件、分辨率转换元件、接收元件等。
(2)元件的申请:
src = Gst.ElementFactory.make("filesrc","fsrc")
src——自定义的变量名(在Python程序中调用此元件时使用)
filesrc——元件的类型(如此元件为播放本地文件的源元件)
fsrc——自定义的此元件在管道内的名称,用于从管道中查找某元件
(3)元件的属性设置
vfilter = Gst.ElementFactory.make("capsfilter", "flt") # 创建过滤元件
caps = Gst.Caps.from_string("video/x-raw,format=BGRA, width=1280, height=720") # 设置视频衬垫属性
vfilter.set_property("caps", caps) # 设置过滤元件衬垫属性
(4)元件连接
always元件连接:
Element1.link(element2)
sometimes元件回调函数连接:
decodebina.connect("pad-added", cb_decodebin_newpad, queuev)
def cb_decodebin_newpad(src, pad, dst):
caps = Gst.Pad.get_current_caps(pad)
structure_name = caps.to_string()
if structure_name.startswith("video"):
videorate_pad = dst.get_static_pad("sink")
pad.link(videorate_pad)
# elif structure_name.startswith("audio"):
# volume_pad = dst2.get_static_pad("sink")
# pad.link(volume_pad)
on request元件连接:
# 获得视频流的请求衬垫
vmuxpad = muxer.get_request_pad("video_%u")
# 获得过滤元件的src衬垫
vsrcpad = vfilter.get_static_pad("src")
# 过滤元件(vmuxpad)和封装元件(vsrcpad)链接
vsrcpad.link(vmuxpad)
(5)查看元件信息的方法
gst-inspect-1.0 元件名称
gst-inspect-1.0 | grep 元件关键字
(6)导入gstreamer包及初始化
import gi
gi.require_version('Gst', '1.0')
from gi.repository import Gst, GObject, GLib
Gst.init(None)
(7)接收元件总结
播放使用的接收元件:xvimagesink
保存视频使用的接收元件:filesink
只处理视频不播放不保存使用的元件:fakesink
(8)视频分辨率转换
# 创建过滤元件
vfilter = Gst.ElementFactory.make("capsfilter", "flt") caps = Gst.Caps.from_string("video/x-raw,format=BGRA, width=1280, height=720") # 设置视频衬垫属性
vfilter.set_property("caps", caps) # 设置过滤元件衬垫属性
# 视频转换元件,自动获取视频格式元件
conv = Gst.ElementFactory.make("videoconvert", "conv")
#使管道支持软件缩放
scale = Gst.ElementFactory.make("videoscale", "scale")
元件连接顺序:conv,scale,vfilter
2.管道
(1)管道创建
initialPipe = Gst.Pipeline.new("initialpipeline")
(2)元件加入管道
pipe.add(element)
(3)管道之间的连接
使用前一管道中最后一个元件的发送衬垫创建ghostpad加入管道,使用后一个管道中第一个元件的接收衬垫创建ghostpad加入管道,而后直接相连。
pad = queue.get_static_pad("src")
ghostpad = Gst.GhostPad.new("src", pad)
pipe.add_pad(ghostpad)
(4)从管道获得指定元件
Pipe.get_by_name("src").set_property("location", rtspPath)
(5)文件描述符创建及赋值
# 创建管道返回一对文件描述符,分别为读和写
video_fd_r, video_fd_w = os.pipe()
# 根据初始管道内设置的元件名称取得视频文件描述符接收元件
fdsink_video = initialPipe.get_by_name("fdsink_video")
# 将视频文件描述符接收元件中的数据写入新建管道
fdsink_video.emit("add", video_fd_w)
(6)播放窗口设置
sink.set_window_handle(self.windowId)
(7)检测插件中的信号
myfilter.connect("detected", self.cb_detection)
当myfilter元件触发detected信号时,调用回调函数cb_detection。