GStreamer Basic Tutorial Introduction

"GStreamer 基础教程:介绍"

Posted by Stephen on March 12, 2022

前言

在音视频领域接触最多实现的方案通常是通过ffmpeg(PC和sever端居多)或者硬件厂家的的SDK实现特定硬件的编解码功能(机顶盒,电视等嵌入式设备)。这里我们介绍一个在国内不太常用的解决方案—-gstreamer媒体库,GStreamer官方说明

gstreamer跟ffmpeg一样,也是一个媒体框架,可以实现采集,编码,解码,渲染,滤镜等一条龙的媒体解决方案。

先看下GStreamer整体的框架

GStreamer是一个非常强大和通用的媒体框架,用于创建流媒体应用程序。GStreamer框架的许多优点来自于它的模块性:GStreamer可以无缝地集成新的插件模块。但是,由于模块化和强大性往往以更高的复杂性为代价,编写新应用程序并不总是容易的。

本指南旨在帮助您理解GStreamer框架,以便您能够基于它开发应用程序。

环境

系统环境

Distributor ID:	Win
Description:	Win10 Profression
Release:	10
Gcc version:         7.5.0  ( Ubuntu 7.5.0-3ubuntu1~18.04 )

软件信息

version : 	
     None

正文

GStreamer 特点

gstreamer跟ffmpeg一样,也是一个媒体框架,可以实现采集,编码,解码,渲染,滤镜等一条龙的媒体解决方案。

  1. 跟ffmpeg一样,也是有命令行工具进行测试验证。同时还可以通过代码框架直接封装命令来做工程开发,这一点ffmpeg是不具备的,ffmpeg需要学习API才能做工程开发,就算你会ffplay.exe或ffmpeg.exe验证某些需求,但要集成到代码,需要学习API来实现。而gstreamer只要知道的命令行实现方式,就可以马上命令行集成到代码中进行使用,当然你想代码优雅一点或者你是熟手也可以使用API来实现。
  2. Gstreamer是glib实现的,跨平台的实现,windows,linux,androd,ios,macos官方原生支持,而且官方发布了windows,linux,androd,ios包,如果没有特别需求,可以直接拿发布包集成使用。而ffmpeg想支持android,ios,就需要自己做交叉编译了。
  3. Gstreamer采用插件实现方式,根据业务需要可以灵活裁剪插件,可以将发布包做的非常小,特别适合在嵌入式和移动端等应用领域,而ffmpeg比较大,在嵌入领域需要自己做代码级裁剪。
  4. Gstreamer 采用glib实现,用C语言来实现面向对象思维,完全不是标准C++那一套逻辑,由于要跨平台,原生的系统API都是适配封装了一套,甚至自己实现队列,MAP,容器,协程,线程,异步操作,不熟悉glib 的API话,代码理解比较困难,用惯了C++,STL,boost,感觉得这是gstream最让人反感的一点,不合主流,搞的我又要学一套API。
  5. Gstreamer采用插件管理各个模块,软件框架比较复杂,采用了异步,协程编程模型,进一步增加了理解难度。

总的来说,与ffmpeg相比,gstreamer用起来简单,但二次开发难度大,因为框架,异步,协程等没有像ffmpeg 代码用起来那么直接和简单。而ffmpeg要理解API才能使用,用起来比较费劲,好在代码理解比较容易,不过容易和简单只是相对的,用久了深入了就容易了。

下面是GStreamer框架的基础教程,有C和Python和JAVA编程语言选择。应用工程建议使用C,python语言(容易理解逻辑)可是现在才更新到基本教程2不完善,tutorial-python,此处使用的是C语言!

注意:python版本有 GLib,GObject,Gst这个三个库,而C版本只有gst

依赖关系,从下到上,GLib,GObject,Gst

中文名: GLib 简介: Linux平台下最常用的C语言函数库 特点: 很好的可移植性和实用性

总的一句话: GLib库是Linux平台下最常用的C语言函数库,它具有很好的可移植性和实用性。

中文名: GObject对象系统 简介: 建立在GLlib基础上的面向对象的框架 特点: 跨平台特色的、灵活的、可扩展的、非常容易映射到其它语言

总的一句话: GObject对象系统是一个建立在GLIB基础上的,具有跨平台特色的、灵活的、可扩展的、非常容易映射到其它语言的面向对象的框架。

GType和GObject的关系

GLib中最有特色的是它的对象系统–GObject System,它是以Gtype为基础而实现的一套单根继承的C语言的面向对象的框架。 GType 是GLib 运行时类型认证和管理系统。GType API 是GObject的基础系统,所以理解GType是理解GObject的关键。

安装 GStreamer

apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-bad1.0-dev gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio

使用 GStreamer 构建应用程序

唯一需要的其他“开发环境”是gcc编译器和文本编辑器。为了编译需要 GStreamer 并使用 GStreamer 核心库的代码,请记住将此字符串添加到您的gcc命令中:

pkg-config --cflags --libs gstreamer-1.0

例如:

gcc basic-tutorial-1.c -o basic-tutorial-1 `pkg-config --cflags --libs gstreamer-1.0`

如果您正在使用其他 GStreamer 库,例如视频库,则必须在上述字符串中的 gstreamer-1.0 之后添加其他包(例如,视频库的 gstreamer-video-1.0)。

Basic tutorials

这些教程描述了理解其余教程所需的GStreamer主题。

GStreamer教程:

基础教程 : GStreamer 介绍

基础教程 1: Hello world!

基础教程 2: GStreamer 概念

基础教程 3: 动态管道

基础教程 4: 时间管理

基础教程 5: GUI工具包集成

基础教程 6: 媒体格式和pad功能

基础教程 7: 多线程和Pad可用性

基础教程 8: 管道短路操作

基础教程 9: 媒体信息收集

基础教程 10: GStreamer工具

基础教程 11: 调试工具

基础教程 12: 流媒体

基础教程 13: 播放速度

基础教程 14: 有用的元素

基础教程 16: 特定平台元素

参考

gstreamer官方教程

gstreamer(一)入门和概述

gStreamer 官方教程资源大全