gstreamer常用知识总结

更多gstreamer知识及代码整理在博客:gstreamer学习笔记

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。

  • 7
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值