GStreamer学习笔记 – GStreamer实现ogg 格式音频播放及代码解析

源代码出处: https://gstreamer.freedesktop.org/documentation/application-development/basics/helloworld.html?gi-language=c

编译 gcc -Wall helloworld.c -o helloworld $(pkg-config --cflags --libs gstreamer-1.0),运行

./helloworld filename.ogg #注意修改成自己的ogg音频文件

代码分析:

代码工作原理图如下:

首先创建file-source element用于从源文件中读取数据,因为Ogg可以以各种格式(如Dirac,MNG,CELT,MPEG-4,MP3等)嵌入音频和视频,所以从本质上来说,从file-source读取出的是音视频复用在一起的数据流。

尽管有些ogg文件只有音频数据,但是既然其可以复用音频和视频,那么其内部的数据格式还是按照复用的协议进行排布的,有区别于一般的单音频文件,所以还是需要使用分离器像对待一般复用了音视频的ogg文件一样进行音频和视频的提取,只不过这时提取到的视频流是空的,这就是为什么上图中需要ogg-demuxer的原因。(注:此段为作者推断)

ogg-demuxer在读取到元数据并进行分离提取音视频数据流的时候,会根据数据流格式动态创建pads(可能是音频数据流,视频数据流,也可能同时包含了两者),并发出pad-added通知事件,所以我们需要在bus中监听捕获demuxer element的pad-added信号,并调用函数 on_pad_added来完成pad的链接,由以下几个函数来完成该功能:

bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline) );

bus_watch_id = gst_bus_add_watch (bus, bus_call, loop)

其中bus_call为bus通知消息到来时候的回调函数。

g_signal_connect (demuxer, "pad-added", G_CALLBACK (on_pad_added), decoder);

其中on_pad_added为pad-added通知事件的回调函数。

再之后,通过解码器(decoder),变流器(converter),和音频输出器(audio-output)将ogg文件转化成声音。

其他函数功能解析: