使用GStreamer实现播放器功能

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,播放,暂停,停止,快放,慢放,倒放都有了,还差什么呢?记不起来了,那就到此为止吧。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值