用 GStreamer 简化 Linux 多媒体开发
- Source Element 数据源元件 只有输出端,它仅能用来产生供管道消费的数据,而不能对数据做任何处理。一个典型的数据源元件的例子是音频捕获单元,它负责从声卡读取原始的音频数据,然后作为数据源提供给其它模块使用。
- Filter Element 过滤器元件 既有输入端又有输出端,它从输入端获得相应的数据,并在经过特殊处理之后传递给输出端。一个典型的过滤器元件的例子是音频编码单元,它首先从 外界获得音频数据,然后根据特定的压缩算法对其进行编码,最后再将编码后的结果提供给其它模块使用。
- Sink Element 接收器元件 只有输入端,它仅具有消费数据的能力,是整条媒体管道的终端。一个典型的接收器元件的例子是音频回放单元,它负责将接收到的数据写到声卡上,通常这也是音频处理过程中的最后一个环节。
GstElementFactory *factory; factory = gst_element_factory_find ("mad");
|
GstElement *element; element = gst_element_factory_create (factory, "decoder");
|
gst_element_unref (element);
|
GstPad *srcpad; srcpad = gst_element_get_pad (element, "src");
|
GList *pads; pads = gst_element_get_pad_list (element); while (pads) { GstPad *pad = GST_PAD (pads->data); g_print ("pad name is: %s\n", gst_pad_get_name (pad)); pads = g_list_next (pads); }
|
struct _GstCaps { gchar *name; guint16 id; guint refcount; GstProps *properties; GstCaps *next; };
|
Pads: SINK template: ’sink’ Availability: Always Capabilities: ’mad_sink’: MIME type: ’audio/mp3’: SRC template: ’src’ Availability: Always Capabilities: ’mad_src’: MIME type: ’audio/raw’: format: String: int endianness: Integer: 1234 width: Integer: 16 depth: Integer: 16 channels: Integer range: 1 - 2 law: Integer: 0 signed: Boolean: TRUE rate: Integer range: 11025 - 48000
|
GstCaps *caps; caps = gst_pad_get_caps (pad); g_print ("pad name is: %s\n", gst_pad_get_name (pad)); while (caps) { g_print (" Capability name is %s, MIME type is %s\n", gst_caps_get_name (cap), gst_caps_get_mime (cap)); caps = caps->next; }
|
- GstPipeline 管道是最常用到的容器,对于一个GStreamer应用程序来讲,其顶层箱柜必须是一条管道。
- GstThread 线程的作用在于能够提供同步处理能力,如果GStreamer应用程序需要进行严格的音视频同步,一般都需要用到这种类型的箱柜。
GstElement *thread, *pipeline; // 创建线程对象,同时为其指定唯一的名称。 thread = gst_element_factory_make ("thread", NULL); // 根据给出的名称,创建一个特定的管道对象。 pipeline = gst_pipeline_new ("pipeline_name");
|
GstElement *element; GstElement *bin; bin = gst_bin_new ("bin_name"); element = gst_element_factory_make ("mpg123", "decoder"); gst_bin_add (GST_BIN (bin), element);
|
GstElement *element; element = gst_bin_get_by_name (GST_BIN (bin), "decoder");
|
GstElement *element; gst_bin_remove (GST_BIN (bin), element);
|
GstElement *bin; GstElement *element; element = gst_element_factory_create ("mad", "decoder"); bin = gst_bin_new ("bin_name"); gst_bin_add (GST_BIN (bin), element); gst_element_add_ghost_pad (bin, gst_element_get_pad (element, "sink"), "sink");
|
GstPad *srcpad, *sinkpad; srcpad = gst_element_get_pad (element1, "src"); sinpad = gst_element_get_pad (element2, "sink"); // 连接 gst_pad_link (srcpad, sinkpad); // 断开 gst_pad_unlink (srcpad, sinkpad);
|
// 连接 gst_element_link (element1, element2); // 断开 gst_element_unlink (element1, element2);
|
- NULL 这是所有元件的默认状态,表明它刚刚创建,还没有开始做任何事情。
- READY 表明元件已经做好准备,随时可以开始处理流程。
- PAUSED 表明元件因某种原因暂时停止处理数据。
- PLAYING 表明元件正在进行数据处理。
GstElement *bin; gst_element_set_state (bin, GST_STATE_PLAYING);
|
#include <gst/gst.h> int main (int argc, char *argv[]) { gst_init (&argc, &argv); }
|
GstElement *pipeline, *filesrc, *decoder, *audiosink;
|
pipeline = gst_pipeline_new ("pipeline");
|
filesrc = gst_element_factory_make ("filesrc", "disk_source"); g_object_set (G_OBJECT (filesrc), "location", argv[1], NULL);
|
decoder = gst_element_factory_make ("mad", "decoder");
|
audiosink = gst_element_factory_make ("audiosink", "play_audio");
|
gst_bin_add_many (GST_BIN (pipeline), filesrc, decoder, audiosink, NULL); gst_element_link_many (filesrc, decoder, audiosink, NULL);
|
gst_element_set_state (pipeline, GST_STATE_PLAYING);
|
while (gst_bin_iterate (GST_BIN (pipeline)));
|
gst_element_set_state (pipeline, GST_STATE_NULL); gst_object_unref (GST_OBJECT (pipeline));
|
#include <gst/gst.h> int main (int argc, char *argv[]) { GstElement *pipeline, *filesrc, *decoder, *audiosink; gst_init(&argc, &argv); if (argc != 2) { g_print ("usage: %s <mp3 filename>\n", argv[0]); exit (-1); } pipeline = gst_pipeline_new ("pipeline"); filesrc = gst_element_factory_make ("filesrc", "disk_source"); g_object_set (G_OBJECT (filesrc), "location", argv[1], NULL); decoder = gst_element_factory_make ("mad", "decoder"); audiosink = gst_element_factory_make ("osssink", "play_audio"); gst_bin_add_many (GST_BIN (pipeline), filesrc, decoder, audiosink, NULL); gst_element_link_many (filesrc, decoder, audiosink, NULL); gst_element_set_state (pipeline GST_STATE_PLAYING); while te (GST_BIN (pipeline)));
|
- 在 GStreamer 的官方网站 http://gstreamer.freedesktop.org上可以找到有关GStreamer的许多资料,包括详细的API手册和插件开发指南等。
转载于:https://blog.51cto.com/general/206628
用 GStreamer 简化 Linux 多媒体开发相关推荐
- 《嵌入式Linux应用开发完全手册》——1.2 基于ARM处理器的嵌入式Linux系统
本节书摘来自异步社区<嵌入式Linux应用开发完全手册>一书中的第1章,第1.2节,作者 韦东山,更多章节内容可以访问云栖社区"异步社区"公众号查看. 1.2 基于AR ...
- Linux 汇编语言开发指南
Linux 汇编语言开发指南 肖文鹏 (xiaowp@263.net), 北京理工大学计算机系硕士研究生 本文作者 肖文鹏是北京理工大学计算机系的一名硕士研究生,主要从事操作系统和分布式计算环境的研究 ...
- 学嵌入式Linux软件开发需要的知识
首先,我得声明嵌入式Linux的内核很重要,非常非常重要!但是这个东西如果你没有一定的基础,还是暂时不碰为好.因为想知道它的工作机理,你必须具备N多知识才可以的.弄明白内核(包括驱动和协议栈,以及内核 ...
- 探索多媒体开发最新最佳实践,我们在深圳等你
2018年初始,音视频技术生态并不平静,Codec争夺愈加激烈,新一代标准的挑战一浪高过一浪:WebRTC的定版也为打通浏览器.移动端乃至IoT带来了机会:此外AI.区块链技术的兴起,催化着与多媒体领 ...
- 学习多媒体开发的正确姿势?陈功:看书 啃代码 搞插件
陈功说,要想学好多媒体开发,首先需要兴趣,接下来还需要好的方法.LiveVideoStack邮件采访了声网Agora首席WebRTC架构师,畅聊了自己的成长经历,WebRTC的演进趋势等.陈功表示,W ...
- Linux驱动开发必看详解神秘内核(完全转载)
Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html IT168 技术文档]在开始步入Lin ...
- 【嵌入式Linux】嵌入式Linux应用开发基础知识之输入系统应用编程
文章目录 前言 1.输入系统应用编程 1.1.输入系统框架及调试 1.1.1.框架概述 1.1.2.编写APP需要的基础知识 1.2.调试技巧 1.2.1.查看设备信息 1.2.2.使用命令查看节点数 ...
- linux c++开发_Linux/Windows下进行C/C++开发的差异
1. 平台差异简介 Windows 和Unix是当前两大主流操作系统平台,基于C/C++的开发人员经常会面临这两个平台之间的移植的问题.Unix作为一个开发式的系统,其下有出现了很 多个分支,包括Su ...
- Linux学习总结(68)——Linux 30年专访:Linus Torvalds谈Linux内核开发与Git
三十年前,当Linus Torvalds(林纳斯·托瓦兹,下文统称Linus)首次发布Linux内核时,他还是赫尔辛基大学(University of Helsinki)的一名21岁的学生,他宣布说: ...
最新文章
- 即学即用的30段Python实用代码
- 李沐团队提出最强ResNet改进版,多项任务达到SOTA | 已开源
- 动森服务器维护时长,《动森》在两三年内都会不断更新内容 保证游戏体验
- python dicom 器官分割_python+opencv阈值分割
- GIS实战应用案例100篇(七)-基于GIS和ENVI的矢量化提取水体边界
- mysql可以存储标点么_MySQL查询(进阶)(每个标点都是重点)
- 动态ip软件win7_IPXE+ISCSI Target安装WIN7
- 数组操作--微信小程序学习教程 1
- Python接口自动化之使用requests库发送http请求
- 解压vmlinuz和解压initrd(initramfs)
- VS2015+WDK10+Win10 Win7以上系统驱动发开环境搭建
- orbSLAM2 之 追踪参考关键帧
- 定时器触发STM32 ADC的采样转换示例
- 阅读记录-统计你的每一次读书和笔记
- iOS12 系统 webView加载H5页面,反复点击网页中视频播放 退出视频全屏 闪退解决方式。
- Linux防火墙放行gre隧道,防火墙 tunnel(GRE隧道)+×××配置过程分析
- 天天学JAVA-JAVA基础(3)
- 前端攻城狮的自我修养1
- V4L2视频驱动框架---v4l2_device管理模块简述
- 今天除夕夜了 祝大家新年快乐 恭喜发财