GStreamer 基础知识
概述
GStreamer is a the multi-platform, modular, open-source, media streaming framework.
GStreamer 是一个跨多平台,模块化的开源的媒体流处理框架。GStreamer 框架旨在使编写处理音频或视频或两者的应用程序变得容易。
它不仅限于音频和视频,还可以处理任何类型的数据流。该框架基于插件,这些插件将提供各种编解码器和其他功能。插件可以链接并排列在管道 pipeline 中。 而管道 pipeline 就定义了了数据流。
GStreamer 的核心功能是为插件、数据流和媒体类型处理/协商提供一个处理框架。它还提供了一些 API,用于使用各种插件编写应用程序。
https://gstreamer.freedesktop.org/documentation/application-development/introduction/gstreamer.html
an API for multimedia applications
a plugin architecture
a pipeline architecture
a mechanism for media type handling/negotiation
a mechanism for synchronization
over 250 plug-ins providing more than 1000 elements
a set of tools
GStreamer 插件可以分为以下几类:
protocols handling 协议处理
sources: for audio and video (involves protocol plugins)
formats: parsers, formaters, muxers, demuxers, metadata, subtitles
codecs: coders and decoders
filters: converters, mixers, effects, …
sinks: for audio and video (involves protocol plugins)
GStreamer 被打包为
gstreamer: the core package
gst-plugins-base: an essential exemplary set of elements
gst-plugins-good: a set of good-quality plug-ins under LGPL
gst-plugins-ugly: a set of good-quality plug-ins that might pose distribution problems
gst-plugins-bad: a set of plug-ins that need more quality
gst-libav: a set of plug-ins that wrap libav for decoding and encoding
a few others packages
多平台
GStreamer 适用于所有主要操作系统,例如 Linux、Android、Windows、Max OS X、iOS,以及大多数 BSD、商业 Unix、Solaris 和 Symbian。
它已被移植到广泛的操作系统、处理器和编译器。 它在所有主要硬件架构上运行,包括 x86、ARM、MIPS、SPARC 和 PowerPC,在 32 位和 64 位以及小端或大端上运行。
GStreamer 可以桥接到其他多媒体框架,以便重用现有组件(例如编解码器)并使用平台输入/输出机制:
Linux/Unix: OpenMAX-IL (via gst-omx)
Windows: DirectShow
Mac OS X: QuickTime
强大的核心库
基于图的结构允许构建任意的流水线 pipeline
基于 GLib 2.0 对象模型进行面向对象设计和继承
小于 500KB 的紧凑型核心库,约 65 K 行代码
多线程 pipeline 的构建简单透明
为插件和应用程序开发人员提供干净、简单和稳定的 API
极其轻量级的数据传递意味着高性能和低延迟
为核心和插件/应用程序开发人员提供完整的调试系统
时钟确保全局的数据流之间的的同步(音视频同步)
通过服务质量 (qos) 确保在高 CPU 负载下获得最佳质量
智能的插件架构
动态加载的插件提供 Element 和媒体类型,通过注册表缓存按需加载,类似于 ld.so.cache
Element 接口处理所有已知类型的源 source、过滤器 filter 和接收器 sinks
Capabilities 系统允许使用 MIME 类型和媒体特定属性验证元素兼容性
Autoplugging 使用 Capabilities系统自动完成复杂路径匹配
可以通过将 pipeline 转储到 .dot 文件并从中创建 PNG 图像来可视化 pipeline
资源友好的插件不会浪费内存
多媒体技术的广泛覆盖
GStreamers 功能可以通过新插件进行扩展。 下面列出的功能只是一个粗略的概述,使用了 GStreamers 自带的插件,不包括任何第三方插件。
容器格式 container formats: asf, avi, 3gp/mp4/mov, flv, mpeg-ps/ts, mkv/webm, mxf, ogg
流媒体 streaming: http, mms, rtsp
编码 codecs: FFmpeg, various codec libraries, 3rd party codec packs
元数据 metadata: native container formats with a common mapping between them
视频 video: various colorspaces, support for progressive and interlaced video
音频 audio: integer and float audio in various bit depths and multichannel configurations
可扩展的开发工具
gst-launch 是用于快速原型设计和测试的命令行工具,类似于 ecasound
有大量文档,包括部分完成的手册和插件编写者指南
每个模块中有大量测试程序和示例代码
可使用各种编程语言访问 GStreamer API
Installation
Linux
sudo apt-get update && apt-get install -y gstreamer1.0-tools gstreamer1.0-nice gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-plugins-good libgstreamer1.0-dev libglib2.0-dev libgstreamer-plugins-bad1.0-dev
MacOS
可从下面的链接下载 https://gstreamer.freedesktop.org/documentation/installing/on-mac-osx.html?gi-language=c
安装后有如下文件:
/Library/Frameworks/GStreamer.framework/: Framework’s root path
/Library/Frameworks/GStreamer.framework/Versions: path with all the versions of the framework
/Library/Frameworks/GStreamer.framework/Versions/Current: link to the current version of the framework
/Library/Frameworks/GStreamer.framework/Headers: path with the development headers
/Library/Frameworks/GStreamer.framework/Commands: link to the commands provided by the framework, such as gst-inspect-1.0 or gst-launch-1.0
#include_path=/Library/Frameworks/GStreamer.framework/Headers
export PATH=$PATH:/Library/Frameworks/GStreamer.framework/Versions/1.0/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/Library/Frameworks/GStreamer.framework/Versions/1.0/lib
Get started
Tools
gst-inspect-1.0 显示可用的插件及 element 列表
gst-launch-1.0 运行 pipeline
gst-typfind
gst-codec-info
gst-device-monitor
gst-launch
查看测试视频
gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink
捕获麦克风并显示声音的波形
gst-launch-1.0 -v -m autoaudiosrc ! audioconvert ! wavescope style=3 shader=2 ! videoconvert ! autovideosink
播放 mp4 文件
gst-launch-1.0 -v playbin uri=file:///`pwd`/material/talk.mp4
UDP 媒体流传输
# linux send h264 rtp stream:
gst-launch-1.0 -v ximagesrc ! video/x-raw,framerate=20/1 ! videoscale ! videoconvert ! x264enc tune=zerolatency bitrate=500 speed-preset=superfast ! rtph264pay ! udpsink host=127.0.0.1 port=5000
# Macos send h264 rtp stream:
gst-launch-1.0 -v avfvideosrc capture-screen=true ! video/x-raw,framerate=20/1 ! videoscale ! videoconvert ! x264enc tune=zerolatency bitrate=500 speed-preset=superfast ! rtph264pay ! udpsink host=127.0.0.1 port=5000
# receive h264 rtp stream:
gst-launch-1.0 -v udpsrc port=5000 caps="application/x-rtp, media=video, clock-rate=90000, encoding-name=H264, payload=96" ! rtph264depay ! decodebin ! videoconvert ! autovideosink
gst-inspect
view plugin videotestsrc
gst-inspect-1.0 videotestsrc
gst-discoverer
check video file codec
gst-discoverer-1.0 ../../../material/talk.mp4