使用GStreamer实现播放器功能

您所在的位置:网站首页 多功能播放器的使用 使用GStreamer实现播放器功能

使用GStreamer实现播放器功能

2024-07-12 00:30| 来源: 网络整理| 查看: 265

GST简介:

gstreamer是linux上的(也支持其它系统) multi-media Framework 多媒体应用框架。一直以来,linux上的多媒体开发都很麻烦,由于没有统一模型,所以很多东西都需要自己实现(或者code copy)。gstreamer的目的就是弥补这一缺陷。 gstreamer有一个核心,核心管理许多的elements。每个element都有自己的功能,比如:音量控制、mp3解码、从硬盘读取多媒体数据、把声音发往声卡等。 用户变成所需要做的,就是把用得着的elements串成线(pipeline)。多媒体流就可以在pipeline里流动了, 一旦pipeline正常工作,就意味着音乐出来了、vedio出来了。 pipeline是在单独的线程中运行的,所以你不必担心自己的进程会阻塞。 并且pipeline线程的管理(创建、销毁、IPC等)都是gstreamer自己负责的,用户程序只需要对其发出控制信息就可以了。

转入正题:

 

1,首先按惯例咱们建一个管道,添几个元件(从网上搜到的):

 m_pipeline = gst_element_factory_make("playbin","player");

 videosink = gst_element_factory_make("ximagesink","videosink");

 audiosink = gst_element_factory_make("alsasink","audiosink");

 

//向管道中添加元件:

 g_object_set(G_OBJECT(m_pipeline),

               "audio-sink", audiosink,

               "video-sink",videosink,

               "volume",m_volume,   // m_volume是音量大小。

                NULL);

 

g_object_set(G_OBJECT(m_pipeline),"uri", uri.c_str(), NULL); //设置视频文件路径

gst_element_set_state(m_pipeline,GST_STATE_READY); //设置管道状态

 

2,管道建立完毕,状态初始化完毕,视频路径设置完毕,似乎可以播放了。是的,

我们来播放一下,点击PLAY(如果你有的话)。

gst_element_set_state(m_pipeline,GST_STATE_PLAYING);

   运气好的话,就可以播放了。

 

3,暂停和停止的实现

   暂停:gst_element_set_state(m_pipeline,GST_STATE_PAUSE);

   停止:gst_element_set_state(m_pipeline, GST_STATE_READY);

 

4,快放,慢放,倒放:

gst_element_seek(m_pipeline, m_speed, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH,

                           GST_SEEK_TYPE_SET,value * GST_MSECOND*1000  ,

                           GST_SEEK_TYPE_SET,GST_CLOCK_TIME_NONE);

 

设m_speed 为当前的播放速度。1为正常播放,大于1为快放,小于1为慢放。0不用说,暂停了呗。

似乎还有小于0的情况,小于0怎么办? 倒放!泼出去的水是收不回来的,GST却可以,就让我们用这个理由来喜欢它吧。

 

value为播放位置,你想跳到什么地方,就设置这个value值。

下面的两个函数可以帮助我们得到当前视频的长度,以及当前的播放位置。

GstFormat fmt =GST_FORMAT_TIME;

gint64m_length, m_position;

gst_element_query_duration(m_pipeline, &fmt, &m_length);

gst_element_query_position(m_pipeline,&fmt, &m_position);

 

至于这个gst_element_seek()的参数具体是什么意思,可以搜一下,我也不啰嗦了。(汗ing,其实我也不大清楚这些参数具体怎么设置)。

     if( m_speed > 0 )

     {

         gst_element_seek (m_pipeline, m_speed,GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH,

                           GST_SEEK_TYPE_SET,value * GST_MSECOND*1000  ,

                           GST_SEEK_TYPE_SET,GST_CLOCK_TIME_NONE);

     }

     else

     {

         gst_element_seek (m_pipeline, m_speed,GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH,

                           GST_SEEK_TYPE_SET,GST_CLOCK_TIME_NONE,

                           GST_SEEK_TYPE_SET,value * GST_MSECOND*1000 );

     }

 

5,播放,暂停,停止,快放,慢放,倒放都有了,还差什么呢?记不起来了,那就到此为止吧。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3