【GStreamer开发】GStreamer播放教程06——可视化音频
目标
GStreamer有一系列把音频转换成视频的element。他们可以用于科学的目的或者增加音乐播放器的趣味性。本教程展示:
如何允许音频的可视化
如何选择可视化element
介绍
在playbin2里面运行音频可视化是非常容易的。当遇到一个只有音频的流时,只需要正确地设置playbin2的一些标志就行了。它会自己创建必要的element然后显示的。
如果你想要增加实际的element的趣味性,你要自己实例化它然后通过vis-plug属性来告诉playbin2。
本教程GStreamer注册的所有关于可视化的element,选择了goom并传给了playbin2
一个有趣的音乐播放器
- <span style="font-size:14px;">#include <gst/gst.h>
- /* playbin2 flags */
- typedef enum {
- << 3) /* Enable rendering of visualizations when there is no video stream. */
- } GstPlayFlags;
- /* Return TRUE if this is a Visualization element */
- static gboolean filter_vis_features (GstPluginFeature *feature, gpointer data) {
- GstElementFactory *factory;
- if (!GST_IS_ELEMENT_FACTORY (feature))
- return FALSE;
- factory = GST_ELEMENT_FACTORY (feature);
- if (!g_strrstr (gst_element_factory_get_klass (factory), "Visualization"))
- return FALSE;
- return TRUE;
- }
- int main(int argc, charchar *argv[]) {
- GstElement *pipeline, *vis_plugin;
- GstBus *bus;
- GstMessage *msg;
- GList *list, *walk;
- GstElementFactory *selected_factory = NULL;
- guint flags;
- /* Initialize GStreamer */
- gst_init (&argc, &argv);
- /* Get a list of all visualization plugins */
- list = gst_registry_feature_filter (gst_registry_get_default (), filter_vis_features, FALSE, NULL);
- /* Print their names */
- g_print("Available visualization plugins:\n");
- for (walk = list; walk != NULL; walk = g_list_next (walk)) {
- const gchar *name;
- GstElementFactory *factory;
- factory = GST_ELEMENT_FACTORY (walk->data);
- name = gst_element_factory_get_longname (factory);
- g_print(" %s\n", name);
- if (selected_factory == NULL || g_str_has_prefix (name, "GOOM")) {
- selected_factory = factory;
- }
- }
- /* Don't use the factory if it's still empty */
- /* e.g. no visualization plugins found */
- if (!selected_factory) {
- g_print ("No visualization plugins found!\n");
- ;
- }
- /* We have now selected a factory for the visualization element */
- g_print ("Selected '%s'\n", gst_element_factory_get_longname (selected_factory));
- vis_plugin = gst_element_factory_create (selected_factory, NULL);
- if (!vis_plugin)
- ;
- /* Build the pipeline */
- pipeline = gst_parse_launch ("playbin2 uri=http://radio.hbr1.com:19800/ambient.ogg", NULL);
- /* Set the visualization flag */
- g_object_get (pipeline, "flags", &flags, NULL);
- flags |= GST_PLAY_FLAG_VIS;
- g_object_set (pipeline, "flags", flags, NULL);
- /* set vis plugin for playbin2 */
- g_object_set (pipeline, "vis-plugin", vis_plugin, NULL);
- /* Start playing */
- gst_element_set_state (pipeline, GST_STATE_PLAYING);
- /* Wait until error or EOS */
- bus = gst_element_get_bus (pipeline);
- msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR | GST_MESSAGE_EOS);
- /* Free resources */
- if (msg != NULL)
- gst_message_unref (msg);
- gst_plugin_feature_list_free (list);
- gst_object_unref (bus);
- gst_element_set_state (pipeline, GST_STATE_NULL);
- gst_object_unref (pipeline);
- ;
- }
- </span>
工作流程
首先,我们都知道通过设置GST_PLAY_FLAG_VIS标志可以让playbin2的音频可视化。如果媒体文件里面已经包含了视频,那么这个标志就不起作用。
- /* Set the visualization flag */
- g_object_get (pipeline, "flags", &flags, NULL);
- flags |= GST_PLAY_FLAG_VIS;
- g_object_set (pipeline, "flags", flags, NULL);
如果用户没有指定可视化插件,playbin2会使用goom来做(如果没有这个element就不能进行音频可视化)。本教程剩下的部分会显示如何来发现一个可用的可视化element并指定playbin2使用。
- /* Get a list of all visualization plugins */
- list = gst_registry_feature_filter (gst_registry_get_default (), filter_vis_features, FALSE, NULL);
gst_registry_feature_filter()检查GStreamer当前所有注册的element并选择那些filter_vis_features函数返回TRUE的element。
- /* Return TRUE if this is a Visualization element */
- static gboolean filter_vis_features (GstPluginFeature *feature, gpointer data) {
- GstElementFactory *factory;
- if (!GST_IS_ELEMENT_FACTORY (feature))
- return FALSE;
- factory = GST_ELEMENT_FACTORY (feature);
- if (!g_strrstr (gst_element_factory_get_klass (factory), "Visualization"))
- return FALSE;
- return TRUE;
- }
这里牵涉到一点关于GStreamer element的理论:每一个GStreamer在运行时加载的文件都被认为是插件。一个插件可以有多个功能,不同种类的功能。
这个函数简单的丢弃了所有不能批量复现的功能以及不包含“可视化”这个功能的插件。
- /* Print their names */
- g_print("Available visualization plugins:\n");
- for (walk = list; walk != NULL; walk = g_list_next (walk)) {
- const gchar *name;
- GstElementFactory *factory;
- factory = GST_ELEMENT_FACTORY (walk->data);
- name = gst_element_factory_get_longname (factory);
- g_print(" %s\n", name);
- if (selected_factory == NULL || g_str_has_prefix (name, "GOOM")) {
- selected_factory = factory;
- }
- }
一旦我们有了可视化插件的列表,我们会打印出它们的名字(gst_element_factory_get_longname())并选择一个(比如:GOOM)。
- /* We have now selected a factory for the visualization element */
- g_print ("Selected '%s'\n", gst_element_factory_get_longname (selected_factory));
- vis_plugin = gst_element_factory_create (selected_factory, NULL);
- if (!vis_plugin)
- ;
选中的工厂用来生成一个GstElement,通过vis-plugin属性来传给playbin2。
- /* set vis plugin for playbin2 */
- g_object_set (pipeline, "vis-plugin", vis_plugin, NULL);
Bingo,就这么简单。
【GStreamer开发】GStreamer播放教程06——可视化音频的更多相关文章
- 【GStreamer开发】GStreamer播放教程09——数字音频传输
目标 本教程展示GStreamer是如何进行数字音频传输的. 介绍 在常见的模拟格式外,高端的音频系统通常都接受数字格式,压缩的非压缩的都能接受.因为音频信号是从电脑传到音箱,用一种更有弹性的形态会更 ...
- 【GStreamer开发】GStreamer基础教程16——平台相关的element
目标 虽然GStreamer是跨平台的framework,但不是所有的element都是在所有平台下都有的.比如,音频和视频的sink都非常依赖于当前的window系统,根据当前的平台需要选择不同的e ...
- gstreamer应用开发(播放器)之旅
GStreamer开发,主要分为两块:应用开发.插件开发. 插件开发人员,通常是编解码库的作者(做出了编解码库后,希望gstreamer能用起来这个库,因此增加这个适配层).芯片原厂人员(将自家的hw ...
- 安装gstreamer开发环境
ubuntu中安装gstreamer开发环境: * 安装gstreamer基本库,工具,以及插件 sudo apt--dev gstreamer-tools gstreamer0.-tools gst ...
- 【转】一步一步教你在Ubuntu12.04搭建gstreamer开发环境
原文网址:http://blog.csdn.net/xsl1990/article/details/8333062 闲得蛋疼 无聊寂寞冷 随便写写弄弄 看到网上蛮多搭建gstreamer开 ...
- FLV提取AAC音频单独播放并实现可视化的频谱
如上图,要实现对FLV直播流中音频的识别,并展示成一个音频相关的动态频谱. 一. 首先了解下什么是声音? 能量波,有频率有振幅,频率高低就是音调,振幅大小就是音量:采样率是对频率采样,采样精度是对幅度 ...
- [C#] NAudio 库的各种常用使用方式: 播放 录制 转码 音频可视化
概述 在 NAudio 中, 常用类型有 WaveIn, WaveOut, WaveStream, WaveFileWriter, WaveFileReader 以及接口: IWaveProvider ...
- Apple Watch开发快速入门教程
Apple Watch开发快速入门教程 试读下载地址:http://pan.baidu.com/s/1eQ8JdR0 介绍:苹果为Watch提供全新的开发框架WatchKit.本教程是国内第一本A ...
- 开发快平台(M302I小e开发板系列教程)
开发快平台(M302I小e开发板系列教程) 开发块平台ESP8266模块相关理解 一. M302I小e开发板源码注释,源码基于:v1.4.0.8-u34.zip 1. user_main.c /*** ...
随机推荐
- [hdu contest 2019-07-29] Azshara's deep sea 计算几何 动态规划 区间dp 凸包 graham扫描法
今天hdu的比赛的第一题,凸包+区间dp. 给出n个点m个圆,n<400,m<100,要求找出凸包然后给凸包上的点连线,连线的两个点不能(在凸包上)相邻,连线不能与圆相交或相切,连线不能相 ...
- Mujin Programming Challenge 2017题解
传送门 \(A\) 似乎并不难啊然而还是没想出来-- 首先我们发现对于一个数\(k\),它能第一个走到当且仅当对于每一个\(i<k\)满足\(x_i\geq 2i-1\),这样我们就可以把所有的 ...
- 洛谷P1731[NOI1999]生日蛋糕
题目 搜索+剪枝,主要考察细节和搜索的顺序,首先可以发现所有数据均为整数,所以初始化每层的蛋糕R和H是整数,然后从高层向低层搜索,然后预处理出各层向低层的最小面积和体积用来剪枝. 就可以每层从当前最大 ...
- Day12:H5
掌握HTML+CSS+JavaScript相关知识 了解HTML5的结构标签: 掌握新增和删去的标签及相关属性 运用HTML5相关知识进行实际开发 下面哪种语法中是对大小写进行区分的? XHTML H ...
- MySQL UPDATE 更新
以下是 UPDATE 命令修改 MySQL 数据表数据的通用 SQL 语法: UPDATE table_name SET field1=new-value1, field2=new-value2 [W ...
- UMD、CommonJS、ES Module、AMD、CMD模块的写法
AMD异步模块规范 RequireJS就是AMD的一个典型的实现. 以下是一个只依赖与jQuery的模块代码: // foo.js define(['jquery'], function($){ // ...
- Docker|部署及简单使用
环境:VMware + centos7 + docker17.05.0 一.安装docker 1.修改ifcfg-ens33 配置虚拟机的网络,保证可以正常联网 命令:vi /etc/sysconfi ...
- 深入浅出一致性Hash原理
转自:https://www.jianshu.com/p/e968c081f563 一.前言 在解决分布式系统中负载均衡的问题时候可以使用Hash算法让固定的一部分请求落到同一台服务器上,这样每台服务 ...
- ubuntu之路——day10.3 train/dev/test的划分、大小和指标更新
train/dev/test的划分 我们在前面的博文中已经提到了train/dev/test的相关做法.比如不能将dev和test混为一谈.同时要保证数据集的同分布等. 现在在train/dev/t ...
- [C++] wchar_t关键字使用方法
char 是单字符类型,长度为一个字节 wchar_t 是宽字符类型,长度为两个字节,主要用在国际 Unicode 编码中 举例: #include<iostream> using nam ...