GStreamer初步_gst audioconverter-程序员宅基地

技术标签: 菜鸟学习GStreamer  

学习《GStreamer开发手册》的一些记录

直接先上helloworld.c的代码,再进行笔记

#include <gst/gst.h>//使用GStreamer必须包含的头文件

/***创建所需元件(全局变量)***/
GstElement *pipeline,*source,*parser,*decoder,*converter,*sink;

/***总线消息***/
static gboolean bus_call(GstBus *bus, GstMessage *msg, gpointer data)
{
    GMainLoop *loop = data;
    //判断消息类型,做出相应的处理
    switch(GST_MESSAGE_TYPE(msg))
    {
    case GST_MESSAGE_EOS:{
   //音频播放结束,退出GLib循环
        g_print("End of streamer\n");
        g_main_loop_quit(loop);
        break;
    }
    case GST_MESSAGE_ERROR:{
   //出现错误,提示错误信息,退出GLib循环
        gchar *debug;
        GError *err;
        //获取错误信息
        gst_message_parse_error(msg,&err,&debug);
        //显示错误信息
        g_printerr("Error from element %s:%s\n",GST_OBJECT_NAME(msg->src),err->message);
        g_printerr("Debugging informatin:%s\n",debug);
        //释放错误信息
        g_free(debug);
        g_error_free(error);
        //退出GLib循环
        g_main_loop_quit(loop);
        break;
    }
    default:
        break;
}

/***动态创建pad***/
static void new_pad(GstElemet *element, GstPad *pad, gpointer data)
{
    GstPad *sinkpad;
    //创建一个sink_pad连接元件parser和decoder
    sinkpad = gat_element_get_pad(decoder,"sink");
    gst_pad_link(pad,sinkpad);
    g_print("Dynamic pad created,linking parser/decoder\n");
    //释放创建的sinkpad
    gst_object_unref(sinkpad);
}

/***主函数***/
int main(int argc, char *argv[])
{
    GMainLoop *loop
    GstBus *bus

    //初始化Gsteamer,GStreamer使用前需要初始化
    gst_init(&argc,&argv);
    //创建GLib循环
    loop = g_main_loop_new(NULL,FALSE);

    //检查输入的参数是否正确
    if(argc != 2)
    {
        g_print("Usage:%s<Ogg/Vorbis filename>\n",argv[0]);
        return -1;
    }

    //创建元件
    pipeline = gst_pipeline_new("audio-player");//名为audio-player的管道 
    //名为file-source,类型为filesrc的源元件,可以读取给出文件的数据
    source = gst_element_factory_make("filesrc","file-source");   
    //名为ogg-parser,类型为oggdemux的分析器
    parser = gst_element_factory_make("oggdemux","ogg-parser"); 
    //名为vorbis-decoder,类型为vorbisdec的解调器
    decoder = gst_element_factory_make("vorbisdec","vorbis-decoder"); 
    //名为converter,类型为audioconvert的转换器
    converter = gst_element_factory_make("audioconvert","converter"); 
    //名为alsa-output,类型为alsasink的接收元件
    sink = gst_element_factory_make("alsasink","alsa-output");
    //判断元件是否被创建,如果出错可以一个个来判断看看,也可以用断言
    if(!pipeline || !source || !parser || !decoder || !converter || !sink)
    {
        g_print("One element could not be created\n");
        return -1;
    }

    //给源元件source提供数据,参数argv[1]是该数据的路径
    g_object(G_OBJECT(source),"location",argv[1],NULL);

    //为管道创建总线,并侦听管消息,之后释放
    bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));
    gst_bus_add_watch(bus,bus_call,loop);//侦听总线消息,调用bus_call函数处理总线消息
    gst_object_unref(bus);

    //把元件加入管道(箱柜)
    gst_bin_add_many(GST_BIN(pipeline),source,parser,decoder,converter,sink,NULL);

    //把元件连接在一起,由于parser的pad需要动态创建,所以要先创建动态pad再讲parser和decoder连接起来
    gst_element_link(source,parse);
    gst_element_link_many(decoder,converter,sink,NULL); 
    //调用new_pad函数动态创建pad并连接parser和decoder
    g_signal_connect(parser,"pad-adder",G_CALLBACK(new_pad),NULL);

    //设置播放状态,进行播放,开启GLib循环
    g_print("Setting to PLAYING\n");
    gst_element_Set_state(pipeline,GST_STATE_PLAYING);
    g_print("Running\n");
    g_main_loop_run(loop);

    //播放结束,释放管道
    g_print("Returned,stopping playback\n");
    gst_element_set_state(pipeline,GST_STATE_NULL);
    g_print("Deleting pipeline\n");
    gst_object_unref(GST_OBJECT(pipeline));

    return 0;
}

这个代码是《GStreamer开发手册》中helloworld.c的代码,我进行了一点注释和略微的修改,后面根据这个代码进行学习笔记。


菜鸟学习,有什么错误希望大家指出来,有什么问题希望我们能一起探讨。
完!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ckx20/article/details/53212867

智能推荐

为什么我们需要企业架构?_企业架构的价值-程序员宅基地

文章浏览阅读1.8k次。良好的IT信息化建设基于两个前提:IT架构与业务价值,缺一不可,二者结合在一起就叫企业架构。IT架构服务于业务价值,而业务价值则通过业务架构来表现出来。_企业架构的价值

C++ Primer Plus(第六版)第9章 内存空间和名称空间_autoscp.cpp-程序员宅基地

文章浏览阅读549次。按住ctrl键选中三个执行文件,用debug模式进行调试。coordin.h// coordin.h -- structure templates and function prototypes// structure templates#ifndef COORDIN_H_#define COORDIN_H_struct polar{ double distance; // distance from origin double angle; // ._autoscp.cpp

倾斜摄影数据OSGB转换成3DML(转载)-程序员宅基地

文章浏览阅读2k次。工具/原料skyline CityBuilder方法/步骤确定手中的osgb数据文件夹符合命名规则,如下图打开CityBuilder(软件许可目前只能申请试用),在工具栏Mesh Layer的下拉选项中选择Import OSGB Layer,弹出相应对话框,在对话框Input folder后的Browse选择上图中的上级文件夹,选择后对话框中的后两项会自动填充,将Metedat..._osgb转skyline

一文搞懂文件系统-程序员宅基地

文章浏览阅读2.2k次,点赞2次,收藏13次。文件系统是计算机操作系统中的一个核心组件,用于管理计算机中的文件和文件夹。它提供了一种组织和访问计算机存储设备上数据的方式。文件系统使用户能够创建、修改、删除和查找文件,以及组织文件和文件夹的层次结构。_文件系统

R绘制基于Cox回归模型的限制性立方样条图_限制性立方样条 cox 模型-程序员宅基地

文章浏览阅读1.4k次,点赞26次,收藏34次。R绘制基于Cox回归模型的限制性立方样条图。_限制性立方样条 cox 模型

java常见面试题(160道)_java面试题-程序员宅基地

文章浏览阅读5.4w次,点赞89次,收藏746次。java常见面试题_java面试题

随便推点

前端开发之Dom的简介和Dom操作_前端dom是什么意思啊-程序员宅基地

文章浏览阅读1.7k次。Dom的简介,Dom获取元素节点,Dom的获取父字关系节点,DOM节点创建,插入,删除,复制节点,设置节点的属性_前端dom是什么意思啊

android开发书籍下载,Android性能优化面试题集锦-程序员宅基地

文章浏览阅读511次,点赞14次,收藏9次。最后看一下学习需要的所有知识点的思维导图。在刚刚那份学习笔记里包含了下面知识点所有内容!文章里已经展示了部分!如果你正愁这块不知道如何学习或者想提升学习这块知识的学习效率,那么这份学习笔记绝对是你的秘密武器!

配置ACL包过滤防火墙典型实验_acl防火墙配置实验-程序员宅基地

文章浏览阅读2.8k次。配置ACL包过滤防火墙_acl防火墙配置实验

吴恩达《机器学习》12-4-12-5:核函数 1、核函数 2_核函数吴恩达-程序员宅基地

文章浏览阅读968次,点赞25次,收藏17次。当实例与地标距离近时,新特征的值趋近于 1,而当距离较远时,新特征的值趋近于 0。在实际应用中,通过选取不同的地标和核函数,能够构建出更加复杂且适应性强的判定边界,从而提高模型的性能。核函数的选择影响了特征的映射效果,而合适的核函数能够在新的特征空间中更好地划分不同类别。因此,需要一种更有效的方法来构造新的特征。核函数的作用在于将实例的原有特征映射到一个新的空间,从而使得在这个新空间中的判定边界更为有效。相应地,代价函数也需要进行调整,其中对于正则化项的计算引入了一个矩阵 M,该矩阵取决于选择的核函数。_核函数吴恩达

org.apache.commons.io.FileUtils 文件操作-程序员宅基地

文章浏览阅读1.1k次。转自:org.apache.commons.io——FileUtils学习笔记 FileUtils类的应用1、写入一个文件;2、从文件中读取;3、创建一个文件夹,包括文件夹;4、复制文件和文件夹;5、删除文件和文件夹;6、从URL地址中获取文件;7、通过文件过滤器和扩展名列出文件和文件夹;8、比较文件内容;9、文件最后的修改时间;10、计算校验和。..._apache common 文件夹创建

EV/HEV中的牵引逆变器驱动优化-程序员宅基地

文章浏览阅读1.6k次,点赞42次,收藏35次。什么是牵引逆变器?从本质上讲,牵引逆变器是电动汽车动力系统中的一个子系统,它从电池中获取高电压,并将其转换为交流电压——因此被称为逆变器——并基本上为电机供电。它控制电机速度和扭矩,直接影响效率和可靠性,这正成为牵引逆变器设计的设计挑战。此图片来源于网络如今的电动汽车至少有一个牵引逆变器。有些型号实际上不止一个。一个在前轴上,一个在后轴上。甚至一些高端车型实际上每个车轮都有一个牵引逆变器。因此,效率和可靠性非常重要。所以,从逆变器和电机控制的市场趋势来看——从技术趋势来看,我们看到了功率水平的提高。

推荐文章

热门文章

相关标签