GStreamer按功能、维护的标准化程度、依赖库的版权差异等分了若干个包(package),如 gstreamergst-plugins-basegst-plugins-goodgst-plugins-ugly,

gst-plugins-badgst-libav。不像FFmpeg按模块功能分几个文件夹(avformat,avcodec,avfilter等),而使用一个仓库来管理代码。

  下面介绍下几个主要包的构建情况,排版格式和介绍逻辑未合理排列,读者自行脑补。

1. 包的构建

  gstreamer:正常编译和安装
  gst-plugins-base:正常编译和安装
  gst-plugins-good:正常构建,其仅需的依赖是gstreamer和gst-plugins-base。
  gst-plugins-bad:依赖gstreamer和gst-plugins-base包的安装。
  gst-libav:依赖libavfilter,libavformat,libavcodec,libavutil,因gstreamer不带编解码器,而是依赖第三方编解码库,尤其是依赖ffmpeg编译出的库!
  gst-devtools:依赖libjson-glib.so(使用apt-get install libjson-glib-dev安装)

2. 插件更新情况

  通过apt-get install ffmpeg安装后,再编译good/bad/ugly包,插件都有相应的增加:
  gst-plugins-good安装后,有74个plugin,74_plugins + 458_features
  gst-plugins-bad安装后,有147个plugin,147_plugins + 623_features
  gst-libav 安装后(拷贝libgstlibav.so至/usr/gst-dev/lib/i386-linux-gnu/gstreamer-1.0/目录),多了一个插件,148_plugins + 1231_features

   //依赖libavcodec,libavformat等,需要加入到LD_LIBRARY_PATH
  另外一个问题,为什么每次都要meson install了后gst-inspect-1.0才能出现libav的相关插件?
  gst-plugins-ugly:156_plugins + 1247_features,其中x264属于ugly这个插件下的。

3. 一些遇到的细节说明

  3.1 mp3解码器——mad

    源码方式安装MP3解码器mad(mpeg audio decoder),验证插件更新情况。
    使用apt-get安装的,只有libmad.so(解码库)和libgstmad.so(对接解码库的插件库),无mad库对应的头文件,那么说明安装发行版本的gst固定绑定某个版本的编解码库,

  并且这种方式安装的编解码库不想被外部其他程序或库来链接。

    mad在2016-12被移除,因为该codec已多年不再被维护,用mpeg123代替。

  3.2 mp3编码库——lame

    拷库方式安装MP3编码器lame(libmp3lame.so)和插件库libgstlame.so
    A.确保编解码库libmad.so存在
    B.拷贝对应的编码器适配库libgstmad.so到gstream-1.0目录
    注意,每多了一个libgst*.so,就增加一个插件。

  3.3 videosink模块

    gst-play-1.0 播放视频,videosink使用了ximagesink(把apt-get安装的置于/usr/gst-dev/lib/i386-linux-gnu/gstreamer-1目录下,即可增加一个插件)
    ximagesink兼容性较好,但耗资源,xvimagesink兼容性差,因缺乏显卡支持会失败,但效率高。autovideosink默认使用ximagesink。

  3.4 aac编解码插件

    源码安装faac/faad2编解码库,需要依赖安装automake、libtool

  3.5 audio input/output插件

    安装alsa库以支持alsa插件libgstalsa:sudo apt-get install alsa-base, alsa-utils, alsa-source,libasound2-dev

  3.6 jpeg编解码插件

    jpegdec/jpegenc插件,依赖libjpeg.so,使用apt-get install libjpeg-dev无法成功,只能使用源码方式编译后安装。

4. 包管理工具——pkg-config

  对于一个比较大的第三方库,其头文件和库文件的数量是比较多的。如果我们自己的程序依赖这个第三方库,那么写Makefile依赖的LD_FLAG和INCLUDE时,

如果一个个手动地写,那将是相当麻烦的。所以,pkg-config就应运而生了。

  pkg-config能够把这些头文件和库文件的位置指出来,给编译器使用,编译时可以这样指定第三方的头文件、库文件路径:

  $gcc main.c `pkg-config --cflags --libs gtk+-2.0` -o main

  描述某个库/头文件信息的*.pc文件,通常放置于/usr/shared/pkgconfig/目录下,pkg-config就是去读这个配置文件来确定某些包的库路径和头文件路径。

  常用命令如下:

  pkg-config --cflags xyz   //列出头文件路径,供第三方编译使用,如果是/usr/include则不显示,因为这个是系统默认目录

  pkg-config --list-all     //列出所有安装的package

GStreamer各个包构建的更多相关文章

  1. 如何在ARM上运行k3s? 窥探k3s启动过程!,内附容器多平台包构建

    开始之前 最近在对华为云鲲鹏服务器(一种ARM服务器arm64)运行容器可行性做验证,顺便了解了很多ARM和容器相关的知识.一提到arm运行容器首先想到的是k3s,下面是用k3s快速搭建一个kuber ...

  2. php的源代码包构建一个空的php扩展。

    下载一个php的源代码包,这里使用的是php 4.0.5版,解压后会看到php的根目录下会有README.EXT_SKEL这样一个文件,打开详细阅读了一下,发现了一个非常好用的工具,这个工具可以帮你构 ...

  3. 使用FIDDER 抓包构建请求

    FIDDER 是一个抓包利器,可以抓去浏览器的http请求. 工作原理是: FIDDER 作为代理. 1.在启动fidder时他自动启动服务监听8888端口.     2.启动FIDDER它会自动修改 ...

  4. Jenkins.war包构建Jenkins平台

    [root@jenkins ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo [roo ...

  5. Linux下基于官方源代码RPM包构建自定义MySQL RPM包

    rpmbuild时不要以root用户执行! 方法一: 1.首先安装rpmbuild #yum install rpm-build gcc gcc-c++ cmake bison ncurses-dev ...

  6. RPM包构建

    参考资料 https://docs-old.fedoraproject.org/en-US/Fedora_Draft_Documentation/0.1/html-single/RPM_Guide/i ...

  7. Python 包构建教程

    目录 setuptools 和 setup.py 你所需要做的事 & 一些概念 基础概念 关于源码分发文件和二进制分发文件 示例和分发选择 pure python module package ...

  8. R语言igraph 包-构建网络图

    igaph 是一个项目,目标是建立一条简单,易用的网络分析工具,有 R, python, C/C++ 等语言的具体实现: 项目主页: http://igraph.org/ 在R语言中,对应的就是 ig ...

  9. Python 中的POST/GET包构建以及随机字符串的生成-乾颐堂

    现在,我们来用Python,创建GET包和POST包. 至于有什么用处,大家慢慢体会. Python 中包含了大量的库,作为一门新兴的语言,Python 对HTTP有足够强大的支持. 现在,我们引入新 ...

随机推荐

  1. Python----Flask Web框架(一)

    Flask是一个轻量级的基于Python的web框架. 本文适合有一定HTML.Python.网络基础的同学阅读. 1. 简介 这份文档中的代码使用 Python 3 运行.是的,所以读者需要自己在电 ...

  2. C# 锁与死锁

    什么是死锁: 所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进. 因此我们举个例子来描述,如果此时有一个线程A,按照先锁a再 ...

  3. [leetcode349]Intersection of Two Arrays

    设计的很烂的一道题 List<Integer> res = new ArrayList<>(); // int l1 = nums1.length; // int l2 = n ...

  4. webapplicationContext之ServletContext等相关概念说明

    1)ServletContext是一个全局的储存信息的空间,所有用户共用一个,其信息必须是线程安全且共享的. ServletContext有一个接口定义:ServletContext接口.此接口定义了 ...

  5. CAP理论和BASE理论及数据库的ACID中关于一致性及不同点的思考

    CAP定理又被称作是布鲁尔定理,是加州大学伯克利分销计算机科学家里克在2000年提出,是分布式理论基础. CAP:是分布式系统的理论基础 [一致性  可用性   分区容错性] BASE理论是对CAP中 ...

  6. Mono for android,Xamarin点击事件的多种写法

    (一)原本java的写法(相信很多是学过java的): 需要实现接口View.IOnClickListener,最好也继承类:Activity,因为View.IOnClickListener接口又继承 ...

  7. 使用mono-repo实现跨项目组件共享

    本文会分享一个我在实际工作中遇到的案例,从最开始的需求分析到项目搭建,以及最后落地的架构的整个过程.最终实现的效果是使用mono-repo实现了跨项目的组件共享.在本文中你可以看到: 从接到需求到深入 ...

  8. ShareSdk自己写的Demo

    安卓原生Demo 根据mob发布的ShareSdk编写的demo,只添加了自己使用到的一些平台. 签名和第三方平台的账号都是用的shareSdk官方Demo的. 因为只是为了展示shareSdk用法, ...

  9. 聊聊并发,进程通信方式,go协程简单应用场景

    开篇提问 知道并发,并行,线程,协程概念吗?或者知道大概含义吗? 有线程为什么还要有协程?区别是什么? 『进程』通信方式知道几种?有没有超过3种? golang『协程』通信方式推荐? 使用并发的目的是 ...

  10. HarmonyOS分布式任务调度开发之--你必须知道的bundleName

    背景 最近基于HarmonyOS在写一个通讯录的项目,已经完成了一个java版本的通讯录,通讯录数据全部存储在sqlite数据库中.现在在着手写一个JS版本的通讯录,这时候关于JS版本中数据的读取,我 ...