Gstreamer的编译以及配置要点[初次总结]

2023-11-19

前言

Gstreamer是一个与ffmpeg齐名的音视频处理库,不过国内一般用的是ffmpeg--其实 gstreamer也蛮好用的。。。

这篇文章主要说明一下如何编译gstreamer以及安装配置插件--起码不会报 插件not found的错误吧。

 

这一篇文章是经过了:

 

GStreamer编译要点+插件需要进行的配置 [草稿]

 

洗礼的,不能保证100%正确,但是思路肯定是正确的。

 

 

配置过程

 

meson

gstreamer的最新版本都用的meson进行构建,所以, meson以及ninja怎么也得要安装配置一下的。包括pkgconfig

libnice

 

其他依赖我就不说了, 自行查看以及安装。

不过libnice不得不说一下,因为它有两点重要的地方:

1、Gstreamer有些插件依赖于libnice的,如果libnice无法正常运行的话,那么到时候插件就会加载失败,结果会出现无法找到插件的错误,例如,webrtc插件--这个插件是很重要的,音视频处理最后肯定要与webrtc进行对接,做实时处理的。

 

例如,笔者被这个问题都弄疯了:

 

2021-01-01_11-45.png

 

ps:提示两点, libnice请使用openssl来编译且openssl的版本要是1.0----openssl的版本一直是一个大问题, openssl1.1在很多库上面譬如,librtmp上面都是无法编译通过的,必须使用openssl1.0---而我们的系统,比如,ubuntu默认自带的openssl版本号是1.1,那么就会出现上面的问题---你编译的libnice使用的是openssl1.1,但是结果找不到某些参数或者函数。

2、libnice编译后同时会生成gstreamer相关的插件,就叫:

libgstnice.so

 

例如这里,

2021-01-01_16-13.png

 

编译后会有一个文件夹目录:

gstreamer-1.0

这里先提前说明,gstreamer所有插件的动态库都放在gstreamer-1.0目录下面的, 到时候你要在 ~/.bashrc下面配置一个GST_PLUGIN_PATH的环境变量 才能让gstreamer正常加载插件,先记住有这个nice插件,等下编译完gstreamer以后再复制到真正的插件目录----如果你编译的时候采用的是默认的路径:/usr/local/ 那么,gstreamer的插件目录就是在 /usr/local/lib/x86-64-linux-gnu/gstreamer-1.0/下面,如果是/usr/local/gst-1.0 那么结构就是:

2021-01-02_09-15.png

 

libnice的编译

 

ps:在编译libnice之前请确保自己已经编译了openssl1.0,例如我编译的openssl版本以及pkgconfig配置如下:

2021-01-02_09-18.png

并且配置了正确的pkgconfig----你编译的openssl的优先级位置起码要高于其他openssl库的位置吧,例如:

 

2021-01-02_09-20.png

 

 

libnice也是使用的meson进行编译的,编译的代码如下:

_tmp_archive='libnice-0.1.17.tar.gz'
_archive_folder=${_tmp_archive%%".tar.gz"}

bd_zip=$_tmp_archive
bd_folder=$_archive_folder
bd_task=$_archive_folder

    echo "*** 解压缩以及编译 $bd_task ***"
    cd $DOWNLOAD_DIR/
    rm -rf "$BUILD_DIR/$bd_folder"
    tar xf "$bd_zip"
    mv "$bd_folder" "$BUILD_DIR/"
    echo "解压到:$BUILD_DIR/$bd_folder"
    cd "$BUILD_DIR/$bd_folder"

##./autogen.sh
##make -j4
##make install
mkdir build
## 新版本的gstreamer使用的是meson构建系统
meson build -Dcrypto-library=openssl
# cd build
ninja -C build
## 安装命令
ninja -C build install

 

顺利的话你会看到以下这些:

 

2021-01-01_16-13.png

 

如果不知道自己安装在案例的请使用:

sudo find / -name ligbstnice.so

 

来查找一下。

 

gstreamer编译+配置

 

 

综述,要编译的gstreamer本体+插件如下

2020-12-31_16-22.png

 

首先,我定义了一个目录用于编译gstreamer -- 那就是:

/usr/local/gst-1.0

 

因为编译过程不知道会遇到什么,分出一个目录比较保险。

 

下面首先编译的是gstreamer-1.18.2,脚本如下:

function build_gstramer(){

_tmp_archive='gstreamer-1.18.2.tar.gz'

_archive_folder=${_tmp_archive%%".tar.gz"}

bd_zip=$_tmp_archive
bd_folder=$_archive_folder
bd_task=$_archive_folder
if [ $is_x86 -eq 1  ]; then
    echo "*** 解压缩以及编译 $bd_task ***"
    cd $DOWNLOAD_DIR/
    rm -rf "$BUILD_DIR/$bd_folder"
    tar xf "$bd_zip"
    mv "$bd_folder" "$BUILD_DIR/"
    echo "解压到:$BUILD_DIR/$bd_folder"
    cd "$BUILD_DIR/$bd_folder"
## ./autogen.sh --disable-gtk-doc
## ./configure --prefix=/usr/local/gst-1.0 --disable-nvdec 
## make -j $jval
## make install
## 新版本的gstreamer使用的是meson构建系统
mkdir build
meson --prefix=/usr/local/gst-1.0 build 
# cd build
ninja -C build
## 安装命令
ninja -C build install

fi
}

 

 

然后顺利的话会看到:[类型目录结构,因为我这边已经编译好,现在是总结编译过程,所以文件会多很多的]:

2021-01-02_09-15.png

 

好了, 因为后续的插件编译肯定会依赖于gstreamer本体的,所以,现在要进行几个地方的配置:

1、pkgconfig的配置---编译时候会通过pkgconfig来查找对应的lib的

2、ld.so.conf -- 运行程序的时候起码会通过这个文件查找动态库的,如果不将gst-1.0的目录加进去是没办法正常运行的

3、~/.bashrc -- 需要配置gst的插件目录,让gstreamer能够正常加载插件。

 

pkgconfig 环境变量配置

首先找到gstreamer的pkgconfig目录,你如果要找的话会发现:

2021-01-02_09-37.png

 

这种形式的,然后:

sudo vim /etc/profile
找到:
PKG_CONFIG_PATH,然后将:
/usr/local/gst-1.0/lib/x86_64-linux-gnu/pkgconfig/
添加进去,譬如:

 

2021-01-02_09-38.png

 

 

ld.so.conf的配置

sudo vim /etc/ld.so.conf
然后将:
/usr/local/gst-1.0/lib/x86_64-linux-gnu/
添加进去

 

例如:

2021-01-02_09-40.png

 

.bashrc的配置

这里先指明一个概念,那就是gstreamer的插件路径

 

先前看到有篇文章是这样说的:

$sudo vim .bashrc(在文件最后新增以下内容保存退出)    
export LD_LIBRARY_PATH=/usr/local/lib    
export GST_PLUGIN_PATH=/usr/local/lib:/usr/lib/aarch64-linux-gnu/gstreamer-1.0  //此处需要根据实际的环境,不一定为aarch64-linux-gnu
$source .bashrc

2021-01-02_09-44.png

 

地址为:

https://www.cnblogs.com/grandblogs/p/12123186.html

 

后来经过我反复验证--错了,不对, 只有下面这个目录才是插件存放地,其他的都不要填上去,否则gstreamer是真的会尝试加载然后报错给你看的:

 

2021-01-02_09-47.png

 

 

那么,我们要配置的参数就很明显了:

vim ~/.bashrc
然后输入:
export LD_LIBRARY_PATH=/usr/local/gst-1.0/lib:/usr/local/gst-1.0/lib/x86_64-linux-gnu/:$LD_LIBRARY_PATH
export GST_PLUGIN_PATH=/usr/local/gst-1.0/lib/x86_64-linux-gnu/gstreamer-1.0/

 

如下图:

2021-01-02_09-51.png

 

然后,---下面就可以继续编译base、good、bad、ugly、libav几个插件合集了,下面是编译代码:

function build_gstramer_base(){
_tmp_archive='gst-plugins-base-1.8.1-1kurento2.tar.xz'
_tmp_archive='gst-plugins-base-1.16.2.tar.xz'
_tmp_archive='gst-plugins-base-1.18.2.tar.gz'

_archive_folder=${_tmp_archive%%".tar.gz"}

bd_zip=$_tmp_archive
bd_folder=$_archive_folder
bd_task=$_archive_folder
if [ $is_x86 -eq 1  ]; then
    echo "*** 解压缩以及编译 $bd_task ***"
    cd $DOWNLOAD_DIR/
    rm -rf "$BUILD_DIR/$bd_folder"
    tar xf "$bd_zip"
    mv "$bd_folder" "$BUILD_DIR/"
    echo "解压到:$BUILD_DIR/$bd_folder"
    cd "$BUILD_DIR/$bd_folder"
## ./autogen.sh --disable-gtk-doc
## ./configure --prefix=/usr/local/gst-1.0 --disable-nvdec 
## make -j $jval
## make install
## 新版本的gstreamer使用的是meson构建系统
mkdir build
meson --prefix=/usr/local/gst-1.0 build 
# cd build
ninja -C build
## 安装命令
ninja -C build install
fi
}


function build_gstramer_good(){
_tmp_archive='gst-plugins-good-1.8.1-1kurento3.tar.xz'
_tmp_archive='gst-plugins-good-1.18.2.tar.gz'

_archive_folder=${_tmp_archive%%".tar.gz"}

bd_zip=$_tmp_archive
bd_folder=$_archive_folder
bd_task=$_archive_folder
if [ $is_x86 -eq 1  ]; then
    echo "*** 解压缩以及编译 $bd_task ***"
    cd $DOWNLOAD_DIR/
    rm -rf "$BUILD_DIR/$bd_folder"
    tar xf "$bd_zip"
    mv "$bd_folder" "$BUILD_DIR/"
    echo "解压到:$BUILD_DIR/$bd_folder"
    cd "$BUILD_DIR/$bd_folder"
## ./autogen.sh --disable-gtk-doc
## ./configure --prefix=/usr/local/gst-1.0 --disable-nvdec 
## make -j $jval
## make install
## 新版本的gstreamer使用的是meson构建系统
mkdir build
meson --prefix=/usr/local/gst-1.0 build 
# cd build
ninja -C build
## 安装命令
ninja -C build install
fi
}


function build_gstramer_bad(){
_tmp_archive='gst-plugins-bad-1.8.1-1kurento4.tar.xz'
_tmp_archive='gst-plugins-bad-1.18.2.tar.gz'

_archive_folder=${_tmp_archive%%".tar.gz"}

bd_zip=$_tmp_archive
bd_folder=$_archive_folder
bd_task=$_archive_folder
if [ $is_x86 -eq 1  ]; then
    echo "*** 解压缩以及编译 $bd_task ***"
    cd $DOWNLOAD_DIR/
    rm -rf "$BUILD_DIR/$bd_folder"
    tar xf "$bd_zip"
    mv "$bd_folder" "$BUILD_DIR/"
    echo "解压到:$BUILD_DIR/$bd_folder"
    cd "$BUILD_DIR/$bd_folder"
## ./autogen.sh --disable-gtk-doc
## ./configure --prefix=/usr/local/gst-1.0 --disable-nvdec 
## make -j $jval
## make install
## 新版本的gstreamer使用的是meson构建系统
mkdir build
meson --prefix=/usr/local/gst-1.0 build  -Dhls-crypto=openssl
# cd build
ninja -C build
## 安装命令
ninja -C build install
fi
}


function build_gstramer_livav(){
_tmp_archive='gst-libav-1.18.2.tar.gz'
_archive_folder=${_tmp_archive%%".tar.gz"}

bd_zip=$_tmp_archive
bd_folder=$_archive_folder
bd_task=$_archive_folder
if [ $is_x86 -eq 1  ]; then
    echo "*** 解压缩以及编译 $bd_task ***"
    cd $DOWNLOAD_DIR/
    rm -rf "$BUILD_DIR/$bd_folder"
    tar xf "$bd_zip"
    mv "$bd_folder" "$BUILD_DIR/"
    echo "解压到:$BUILD_DIR/$bd_folder"
    cd "$BUILD_DIR/$bd_folder"
## ./autogen.sh --disable-gtk-doc
## ./configure --prefix=/usr/local/gst-1.0 --disable-nvdec 
## make -j $jval
## make install
## 新版本的gstreamer使用的是meson构建系统
mkdir build
meson --prefix=/usr/local/gst-1.0 build 
# cd build
ninja -C build
## 安装命令
ninja -C build install
fi
}



function build_gstramer_ugly(){
_tmp_archive='gst-plugins-ugly-1.18.2.tar.gz'

_archive_folder=${_tmp_archive%%".tar.gz"}

bd_zip=$_tmp_archive
bd_folder=$_archive_folder
bd_task=$_archive_folder
if [ $is_x86 -eq 1  ]; then
    echo "*** 解压缩以及编译 $bd_task ***"
    cd $DOWNLOAD_DIR/
    rm -rf "$BUILD_DIR/$bd_folder"
    tar xf "$bd_zip"
    mv "$bd_folder" "$BUILD_DIR/"
    echo "解压到:$BUILD_DIR/$bd_folder"
    cd "$BUILD_DIR/$bd_folder"
## ./autogen.sh --disable-gtk-doc
## ./configure --prefix=/usr/local/gst-1.0 --disable-nvdec 
## make -j $jval
## make install
## 新版本的gstreamer使用的是meson构建系统
mkdir build
meson --prefix=/usr/local/gst-1.0 build 
# cd build
ninja -C build
## 安装命令
ninja -C build install
fi
}

 

 

然后,最后,还记得libgstnice.so吗?

sudo cp /usr/local/lib/x86_64-linux-gnu/gstreamer-1.0/libgstnice.so /usr/local/gst-1.0/lib/x86_64-linux-gnu/gstreamer-1.0/

将它复制到插件目录,然后你会发现:

2021-01-01_16-18.png

 

nice插件也能正常运行了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Gstreamer的编译以及配置要点[初次总结] 的相关文章

随机推荐

  • MES在流程和离散型制造企业的应用存在哪些差别?

    企业的生产方式 主要可以分为按定单生产 按库存生产或上述两者的组合 从生产类型上考虑 则可以分为批量生产和单件小批生产 从产品类型和生产工艺组织方式上 企业的行业类型可分为流程生产行业和离散制造行业 典型的流程生产行业有医药 石油化工 电力
  • C++ 拷贝构造函数和赋值运算符

    本文主要介绍了拷贝构造函数和赋值运算符的区别 以及在什么时候调用拷贝构造函数 什么情况下调用赋值运算符 最后 简单的分析了下深拷贝和浅拷贝的问题 拷贝构造函数和赋值运算符 在默认情况下 用户没有定义 但是也没有显式的删除 编译器会自动的隐式
  • Direct3D光照

    光照的组成 环境光 这种类型的光经其他表面反射到达物体表面 并照亮整个场景 要想以较低代价粗略模拟这类反射光 环境光是一个很好的选择 漫射光 这种类型光沿着特定的方向传播 当它到达某一表面时 将沿着各个方向均匀反射 无论从哪个方位观察 表面
  • Spring的资源访问接口---Resource

    JDK提供的访问资源的类 File等 不能很好满足各种某些资源的访问需求 比如缺少从类路径和Web容器的上下文中获取资源的资源操作类 Spring的Resource接口提供了更好用的资源访问能力 Spring使用Resource访问各种资源
  • linux 交叉编译找不到库文件

    网上大众的作法这里不做介绍 在编译一些库的时候可能某些工具会用到宿主机的 而这些工具在调用的时候会找和宿主机匹配的库 而交叉编译的库是不能用的 遇见这种情况基本是解决不了的 但是可以通过configure 的选项去掉这些过程 举个例子 我在
  • MySQL多列字段去重的案例实践

    同事提了个需求 如下测试表 有code cdate和ctotal三列 select from tt 现在要得到code的唯一值 但同时带着cdate和ctotal两个字段 提起 唯一值 想到的就是distinct distinct关键字可以
  • Nodejs版本管理工具mvn部署

    部署mvn curl o https raw githubusercontent com creationix nvm v0 34 0 install sh bash 添加环境变量 vim zshrc export NVM DIR HOME
  • Webpack中的tree-shaking

    文章目录 Webpack中的tree shaking 简单实践 副作用sideEffects sideEffects配置项 false 数组 结论 Webpack中的tree shaking tree shaking就是把js文件中无用的模
  • 【编程题】——求链表的中间节点

    题目 求链表的中间结点 如果链表中结点总数为奇数 返回中间结点 如果结点总数是偶数 返回中间两个结点的任意一个 思路 定义两个指针 一个指针一次走一步 另一个指针一次走两步 当走得快的指针到达链表末尾的时候 走得慢的指针刚好达到链表的中间节
  • 文件管理系统(操作系统)——9张思维导图

    文件管理系统 1 文件管理 1 1 一个文件的逻辑结构 比如一个文本txt文件 又或者Excel文件 在我们用户看来 它是长什么样的 这个就是逻辑结构 几个概念 逻辑结构 就是指在用户看来 单个文件内部的数据应该是如何组织起来的 物理结构
  • 黑马SpringBoot笔记

    基础篇 把Tomcat服务器更换成Jetty服务器 排除Tomcat依赖更换为Jetty
  • 【Java面试题汇总】Redis篇(2023版)

    导航 黑马Java笔记 踩坑汇总 JavaSE JavaWeb SSM SpringBoot 瑞吉外卖 SpringCloud 黑马旅游 谷粒商城 学成在线 牛客面试题 目录 1 说说你对Redis的了解 2 说说Redis的单线程架构 3
  • 7.java类中的方法

    1 类中的方法 1 实例方法 格式 访问限制修饰符 方法的返回值数据类型 方法名称 参数列表 方法体 解释 访问限制修饰符 public 缺省的 方法的返回值数据类型 就是方法的执行结果类型 有返回值时 方法的返回值数据类型一定是方法执行结
  • FPGA硬件工程师Verilog面试题(基础篇二)

    作者简介 大家好我是 嵌入式基地 是一名嵌入式工程师 希望一起努力 一起进步 个人主页 嵌入式基地 系列专栏 FPGA Verilog 习题专栏 微信公众号 嵌入式基地 FPGA硬件工程师Verilog面试题 二 习题一 多功能数据处理器
  • 大数据hive篇--常用操作

    文章目录 hive常用操作 一 建表 1 自定义分隔符 2 JSON分隔符 3 正则分隔符 将查询的结果导入新表 表的类别 外部表 内部表 分区表 导入数据 使用分区表 声明存储格式 二 常用函数 开窗函数 开窗函数常用的函数 炸裂函数 列
  • Android RecyclerView最全使用详解

    本文目录 RecyclerView概述 RecyclerView使用 基础篇 第一步 添加RecyclerView 第二步 添加布局文件 第三步 添加逻辑代码 运行效果 RecyclerView使用 进阶篇 布局管理器 线性布局管理器 网格
  • Go语言学习4-数组类型

    数组类型 引言 1 数组 1 1 类型表示法 1 2 值表示法 1 3 属性和基本操作 总结 引言 上篇我们了解 Go语言的基本数据类型 现在开始介绍数组类型 主要如下 1 数组 在Go语言中 数组被称为Array 就是一个由若干相同类型的
  • 2020-10-24 大数据面试问题

    上周面试数据开发职位主要从公司的视角讲一下记录下面试流水 1 三面技术一轮hr 面到了cto 整体来看是这一周技术含量最高信息量最大的一个 1到4轮过了4个小时 技术上的问题主要问的对数据分层的理解 1 一面自我介绍 目前团队的规模多大 2
  • IDEA 启动失败(因为修改了vmoptions后无法启动)

    本人亲历 找过好多方法 才解决的 包括但不限于 找 vmoption文件的时候 说是在C盘 死活找不到 不过已经解决了 也成功了 还成功添加了破解码 后面出文 想添加破解码 要修改vmpotion 结果直接启动不了了 然后重启IDEA的时候
  • Gstreamer的编译以及配置要点[初次总结]

    前言 Gstreamer是一个与ffmpeg齐名的音视频处理库 不过国内一般用的是ffmpeg 其实 gstreamer也蛮好用的 这篇文章主要说明一下如何编译gstreamer以及安装配置插件 起码不会报 插件not found的错误吧