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") 
                    
                     
                    
                 
                    
                