技术研究之GStreamer

标签: 无 分类: 未分类 创建时间:2025-07-05 07:56:41 更新时间:2025-09-26 04:44:39

前言

Gstreamer是一个支持Windows,Linux,Android, iOS的跨平台的多媒体框架,应用程序可以通过管道(Pipeline)的方式,将多媒体处理的各个步骤串联起来,达到预期的效果。每个步骤通过元素(Element)基于GObject对象系统通过插件(plugins)的方式实现,方便了各项功能的扩展。

参考文章:
【1】.什么是Gstreamer

1.windows 安装

在windows上安装gstreamer,需要安装MSYS2,然后安装pygobject,如果不这样做,pygobject可能无法安装成功,反正我直接使用 pip 安装pygobject 会报错。
经过长时间折腾,我发现我还是没有在windows上安装配置成功 gstreamer + pygobject ,很多的东西都没有办法处理,问题是一个接着一个,到底哪里问题呢?

1.安装gstreamer

前往官网下载相应windows版本,执行安装程序。

2.设置环境变量

将 gstreamer 的bin目录添加到系统环境变量中,如:C:\Program Files\GStreamer\1.0\bin。

3.安装pygobject

(1) 安装MSYS2:
从MSYS2官网下载 MSYS2 安装程序并运行。安装过程中选择一个不包含空格和中文的安装目录。完成安装后,勾选“Run MSYS2 now”并点击“Finish”。

(2) 更新MSYS2:
打开MSYS2终端,执行命令更新软件包列表和包管理器。如果提示需要重启MSYS2终端,请关闭并重新打开。

1
pacman -Syu 

(3) 安装PyGObject和依赖:
在MSYS2终端中,执行以下命令安装PyGObject和其他必要的依赖库:

1
pacman -S mingw-w64-ucrt-x86_64-gtk4 mingw-w64-ucrt-x86_64-python3 mingw-w64-ucrt-x86_64-python3-gobject

根据提示,确认安装并等待完成。

(4) 验证安装:
安装完成后,可以在Python脚本中导入gi模块来验证PyGObject是否安装成功。例如,创建一个名为test.py的文件,内容如下,将脚本放到 C:\msys64\home\hjkj 下,然后执行 python test.py。就可以查看一个GTK窗口。

1
2
3
4
5
6
7
8
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

win = Gtk.Window()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()

在MSYS2终端中运行python test.py,如果能够正常显示一个GTK窗口,则说明PyGObject安装成功。

注意

如果Python版本不是64位的,可能需要安装mingw-w64-i686-python-gobject。
如果安装过程中遇到问题,可以尝试更新MSYS2或者搜索相关的错误信息。

参考文章:
【1】.笔记: PyGObject 在 windows 上安装的曲折经历
【2】.Getting Started 这里是官方关于不同系统安装运行 pygobject 的方法。
【3】.python tar.gz怎么安装?tar.gz格式第三方库安装详解
【4】.PyGObject 安装了 libxrender1 libxcb-shm0 libpixman-1-0 libcairo-gobject2 libgirepository-1.0-1 libcairo2 libxcb-render0

2.linux安装

这里我在尝试使用UOS进行安装配置,也就是使用 yum 进行安装。

1
2
3
4
5
sudo dnf install gcc gobject-introspection-devel cairo-gobject-devel pkg-config gtk4

# 使用pip 安装 pygobject
pip3 install pycairo
pip3 install PyGObject

参考文章:
【1】.视频监控笔记(四):Ubuntu配置GStreamer实现python推流 这里用的是 ubuntu 进行的开发。
【2】.Download GStreamer

问题

1.’gbk’ codec can’t decode byte 0xae in position 7746: illegal multibyte sequence

这是安装 pygobject 这个包的时候,在windows上报的错误。
【尝试方案】
(1).修改安装脚本
结果没有找到这个文件,所以没有修改。

(2).修改环境变量
增加了 PYTHONIOENCODING=utf-8 这个环境变量,结果无效。

【解决方案】
通过控制面板 -> 时钟和区域 -> 区域 -> 更改系统区域设置 -> Beta版,这个勾选上。

参考文章:
【1】.PIP安装第三方库报错UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xa4 in position 469: illegal multibyte 这里是修改安装脚本进行处理
【2】.Where to set PYTHONIOENCODING=UTF-8?
【3】.解决python3编码问题的方法 在环境变量中,设置PYTHONIOENCODING=utf-8
【4】.打开后不显示文字或乱码 解决关于图新地球乱码的问题,设置了系统区域选项

5.Dependency ‘girepository-2.0’ is required but not found

在 windows 上安装 pygobject 的时候,报错。

【尝试方案】
(1)尝试清空缓存

1
2
pip cache purge
pip install --no-cache-dir pygobject

(2)尝试安装 CMake

【解决方案】
安装低版本

1
pip install pygobject==3.50.1

参考文章:
【1】.PyGObject>=3.51.0 depends on libgirepository 2.0

6.Namespace Gst not available

在windows上安装配置了gstreamer,但是运行程序的时候,报错。

【解决方案】
设置环境变量

1
set GI_TYPELIB_PATH=C:\Program Files\gstreamer\1.0\msvc_x86_64\lib\girepository-1.0

7.Could not locate g_option_error_quark: ‘gobject-2.0-0.dll’: 找不到指定的模块。

【解决方案】
重新安装 gstreamer,然后设置环境变量,换到了一个没有空格的目录下,然后设置环境变量

1
2
export GI_TYPELIB_PATH=/c/gstreamer/1.0/msvc_x86_64/lib/girepository-1.0
export PATH=/c/gstreamer/1.0/msvc_x86_64/bin:$PATH

8.unable to create a wrapper for GLib.Error

在 MSYS2 UCRT64 环境下,安装 pygobject 时报错。
【尝试方案】
(1)尝试安装依赖,无效

1
2
3
pacman -Sy mingw-w64-ucrt-x86_64-glib2 \
mingw-w64-ucrt-x86_64-gstreamer \
mingw-w64-ucrt-x86_64-gst-plugins-base

(2)尝试设置环境变量,无效

1
export GST_PLUGIN_PATH=/c/gstreamer/1.0/msvc_x86_64/lib/gstreamer-1.0

(3)尝试设置环境变量,无效

1
2
set PATH=C:\gstreamer\1.0\msvc_x86_64\bin;%PATH%
set GI_TYPELIB_PATH=C:\gstreamer\1.0\msvc_x86_64\lib\girepository-1.0

9.Dependency ‘gobject-introspection-1.0’ is required but not found.

从 2.0 降级到 1.0,我又遇到了新的问题。

【尝试方案】
(1)尝试安装 3.42.2 版本,结果报错:gi\gimodule.c: fatal error C1083: 无法打开包括文件: “msvc_recommended_pragmas.h”: No such file or directory

1
pip install pygobject==3.42.2

参考文章:
【1】.No package ‘gobject-introspection-1.0‘ found

小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件(ititchuan@gmail.com)通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
ititchuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。