基于Gstreamer的应用

应用上层了解如何基于gstreamer 的api来构建一个视频播放的应用

2.1 基于gstreamer api的MP3 播放

基本的一个流程

1、初始化gst, 开始一个主的循环,

2、定义一个pipeline 和 pipeline里面需要的元素比如有source decoder  sink等。

3、设置必要组件的一些信息。

4、获取总线,监听总线的消息。

5、调用gst_bin_add_many将各个element 组成pipeline,然后调用gst_element_link_many,将这些组件链接在一起

6、设置pipeline的状态为playing。

7、开始执行这个主循环

8、在总线的监听回调函数中,如果监听到文件末尾的事件,就退出主循环。

9、代码示例:


  

 GMainLoop *loop;

    GstElement *pipeline,*source,*decoder,*sink;//定义组件

    GstBus *bus;

    gst_init(&argc,&argv);

    loop = g_main_loop_new(NULL,FALSE);//创建主循环,在执行 g_main_loop_run后正式开始循环

    if(argc != 2)

    {

        g_printerr("Usage:%s <mp3 filename>\n",argv[0]);

        return -1;

    }

    //创建管道和组件

    pipeline = gst_pipeline_new("audio-player");

    source = gst_element_factory_make("filesrc","file-source");

    decoder = gst_element_factory_make("mad","mad-decoder");

    sink = gst_element_factory_make("autoaudiosink","audio-output");

    if(!pipeline||!source||!decoder||!sink){

        g_printerr("One element could not be created.Exiting.\n");

        return -1;

    }



    //设置 source的location 参数。即 文件地址.

    g_object_set(G_OBJECT(source),"location",argv[1],NULL);



    //得到 管道的消息总线

    bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));

   //添加消息监视器

    gst_bus_add_watch(bus,bus_call,loop);

    gst_object_unref(bus);



    //把组件添加到管道中.管道是一个特殊的组件,可以更好的让数据流动

    gst_bin_add_many(GST_BIN(pipeline),source,decoder,sink,NULL);



   //依次连接组件

   gst_element_link_many(source,decoder,sink,NULL);



   //开始播放

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

    gst_object_unref(GST_OBJECT(pipeline));

    return 0;

2.2 qt mutlimedia

  qt是通过QMediaPlayer来进行操作的。 QMediaPlayer集成了底部包括音频输出和音频文件读取等等操作,是一个高层次的,封装好的播放器内核,通过调用它,你可以实现输入任意格式的视频、音频播放,并实现对其播放状态的调整。

    用QMediaPlayer来播放一段音乐的代码

player = new QMediaPlayer;

player->setMedia(QMediaContent(QUrl::fromLocalFile("coolsong.mp3")));

player->play();

第一步:创建QMediaplayer对象;第二步:设置当前播放的媒体文件;第三步:播放。

QMediaPlayer底层则是gstreamer经过一系列的封装 来提供实现的。

  

 具体的流程

    QMediaPlayer 经过一系列的调用 最后所有的操作都会调用到QGstreamerPlayerSession里。在 QGstreamerPlayerSession的构造函数中 调用gst_element_factory_make("playbin3", NULL);

创建好了gstreamer的 playbin pipeline,同时设置了playbin 的videoSink和AudioSink, 并监听了bus,最后对一些消息设置回调函数。如下图 所有QMediaPlayer的pause paly stop等播放控制的操作,最后都是对这个playbin 设置不同的状态。如play的操作:gst_element_set_state(m_playbin, GST_STATE_PLAYING)

 

在了解了gstreamer的基本概念和流程之后,就要深入gstreamer的源码去了解gstreamer的工作机制。

猜你喜欢

转载自blog.csdn.net/H2008066215019910120/article/details/112564981