GStreamer开发笔记(七):gstreamer播放ogg详解
前言
gtreamer播放ogg音频文件的流程讲解。
Ogg全称是OGGVobis(oggVorbis)是一种音频压缩容器格式。Ogg格式不仅是一个高效的容器格式,它还融合了Vorbis、Theora和Speex等多种媒体压缩技术。Ogg不仅是一个容器格式,更融合了多种媒体压缩技术,如Vorbis(音频)、Theora(视频)和Speex(语音)。值得一提的是,我们之前介绍的高保真FLAC格式也可以被纳入Ogg框架之中。因此,我们所探讨的Ogg,通常指的是Ogg与Vorbis的组合。
GStreamer是一个非常强大和通用的框架,用于创建流媒体应用程序。GStreamer框架的许多优点来自其模块化:GStreamer可以无缝地整合新的插件模块。但是,由于模块化和强大的功能往往以更高的复杂性为代价,编写新的应用程序并不总是那么容易。
GStreamer分为:
- gstreamer:核心包
- gst-plugins-base:一组基本的示例元素
- gst-plugins-good:LGPL下的一组高质量插件
- gst-plugins-ugly:一组可能造成分发问题的高质量插件
- gst-plugins bad:一组需要更高质量的插件
- gst-libav:一组封装libav进行解码和编码的插件
- 其他几个包

使用gst-inspect-1.0可以检测到本地安装了哪些模块,如下:







连接组件后,这里分割器分割一个流就会回调产出一个pad,要对pad在创建时动态关联解码器,解码器才到sink播放。




/******************** test003 ********************/
static gboolean bus_call (GstBus *bus, GstMessage *msg, gpointer data)
{
GMainLoop* loop = (GMainLoop *) data;
switch(GST_MESSAGE_TYPE(msg))
{
case GST_MESSAGE_EOS:
g_print ("End of stream\n");
g_main_loop_quit (loop);
break;
case GST_MESSAGE_ERROR:
{
gchar *debug;
GError *error;
gst_message_parse_error (msg, &error, &debug);
g_free (debug);
g_printerr ("Error: %s\n", error->message);
g_error_free (error);
g_main_loop_quit (loop);
break;
}
default:
break;
}
return TRUE;
}
static void on_pad_added (GstElement* element, GstPad* pad, gpointer data)
{
GstPad *sinkpad;
GstElement *decoder = (GstElement *) data;
// 现在可以将这个焊盘与vorbis解码器接收焊盘连接起来
g_print ("Dynamic pad created, linking demuxer/decoder\n");
sinkpad = gst_element_get_static_pad(decoder, "sink");
gst_pad_link (pad, sinkpad);
gst_object_unref (sinkpad);
}
void test003PlayOggDemo(int *argc, char **argv[])
{
char const * fileName = "/home/yang/work/test/1.ogg";
// char const * fileName = "/home/yang/work/test/1.mp3";
// char const * fileName = "/home/yang/work/test/1.mov";
GMainLoop *loop;
GstElement *pipeline, *source, *demuxer, *decoder, *conv, *sink;
GstBus *bus;
guint bus_watch_id;
// 步骤一:初始化gst
gst_init (argc, argv);
// 步骤二:创建gmain消息循环
loop = g_main_loop_new (NULL, FALSE);
// 步骤三:创建组建
pipeline = gst_pipeline_new ("audio-player");
// 组件类型 组件唯一名称
source = gst_element_factory_make ("filesrc", "file-source");
demuxer = gst_element_factory_make ("oggdemux", "ogg-demuxer");
// demuxer = gst_element_factory_make ("mpeg123", "mp3-demuxer"); // mp3: 不用分割,所以步骤不一样
// demuxer = gst_element_factory_make ("splitmuxsink", "mov-demuxer");// mov: 分割格式不一样,要修改代码,没改了
decoder = gst_element_factory_make ("vorbisdec", "vorbis-decoder");
conv = gst_element_factory_make ("audioconvert", "converter");
sink = gst_element_factory_make ("autoaudiosink", "audio-output");
if(!pipeline || !source || !demuxer || !decoder || !conv || !sink)
{
g_printerr ("One element could not be created. Exiting.\n")
