基于GStreamer的音视频播放器的设计

基于GStreamer的音视频播放器的设计
左登超;左登峰;刘永康
【摘 要】At present, Windows system was used to design the player for most of the railway passenger cars. But the Windows system is vulnerable to viruses and can easily cause a crash when a passenger car is often powered off and reset. In order to solve these problems, this article proposed the construction of the player using GStreamer framework based on the Linux system, gave the system running effect diagram. The verification results showed that the audio and video player got clear and stable playback effect with short development cycle and strong practicability under the GStreamer framework.%目前,铁路客车大多使用Windows系统进行播放器的设计.Windows系统容易感染病毒,并且在铁路客车经常断电复位的情况下,很容易造成系统崩溃.为了解决上述问题,文章提出了在Linux系统下,使用GStreamer框架进行播放器的构建并给出系统运行效果图.经装车验证,在GStreamer框架下构建的音视频播放器的播放效果清晰、稳定,开发周期短,实用性较强.
【期刊名称】《铁路计算机应用》
【年(卷),期】2017(026)011
【总页数】5页(P41-44,53)
【关键词】Linux;GStreamer;QT;音视频播放器
【作 者】左登超;左登峰;刘永康
【作者单位】中车青岛四方车辆研究所有限公司,青岛 266031;内蒙古银行总行 科技信息部,呼和浩特 010010;中车青岛四方车辆研究所有限公司,青岛 266031
【正文语种】中 文
【中图分类】U285;TP39
目前,铁路客车上大多使用Windows系统进行播放器的设计。在向娱乐系统拷贝节目时,Windows系统容易感染病毒,并且在铁路客车经常断电复位的情况下,很容易造成系统崩溃。为了解决上述问题,本文提出了在Linux系统下,使用GStreamer框架进行播放器的构建。使经常断电复位对Linux系统不会造成影响,并且Linux系统不易感染病毒。GStreame
r框架在设计时采用了非常灵活的体系结构,并提供了各种各样的预定义媒体处理模块,简化了在Linux下开发多媒体应用的过程。
GStreamer是基于插件的流媒体应用程序开发框架。插件提供了各种各样的多媒体数字信号编解码器。开发者利用GStreamer提供的插件、API接口及数据结构,可以编写一个适用于特定环境下的音视频播放器[1]。文章主要分析GStreamer框架构建播放器的基本思想,为后面构建播放器奠定理论基础。
元件是GStreamer框架中最基本的类对象。可以创建一系列的元件并把它们链接起来,使数据流在被连接的各元件之间进行传输,从而创建一个管道来完成一个特殊任务,例如:媒体播放或者录音[2]。每个元件都有一个特殊的函数接口,有些接口可以用来读取文件、解码文件;有些接口则只是输出相应的数据到具体的设备上,例如:声卡设备。GStreamer默认安装了很多有用的元件,通过使用这些元件,可以构建一个具有多种功能的播放器。
当链接元件时,衬垫就是元件的输入输出,用来在元件之间协商链接和数据流动。一个衬垫可以看作元件上的一个“插口”或者“端口”[3]。通过衬垫,数据可以流出或者从其他元件流入。衬垫有特定的数据处理能力,一个衬垫能够限制数据流类型的通过。只有在两个衬垫
允许通过的数据类型一致时,元件之间的链接才被建立。数据类型使用了一个叫做caps negotiation的过程,在衬垫之间进行协商。
数据流建立起链接的元件之间流动。数据向元件以外流出可以通过一个或者多个source衬垫,元件接收数据是通过一个或者多个sink衬垫来完成的。source元件(接收数据)和sink元件(输出数据)分别有且仅有一个sink衬垫或者source 衬垫。数据在这里代表的是缓冲区(Buffers) (GstBuffer对象描述了数据的缓冲区信息)和事件(Events) (GstEvent对象描述了数据的事件信息) [4]。
一个箱柜是一个容器,可以容纳一堆元件。箱柜是元件的子类,可以像控制一个元件一样控制一个箱柜,可以为应用程序屏蔽很多的复杂性[5]。例如,通过改变某一个箱柜的状态来改变它所包含的所有元件状态。箱柜也可以将来自其所包含的元素的总线消息向前传递。(例如:error messages, EOS messages)。
一个Pipeline是一个顶层的Bin,为应用程序提供了一个软件层面上的总线并且为其所包含的元件管理同步[3]。当将Pileline设置为PAUSED或者PLAYING状态时, 数据流动将会开始并且媒体处理也将会发生。此时,Pipelines在一个分离线程中运行直到外界停止此管道的
或者管道达到数据流的末尾。
GStreamer框架为应用程序和管道之间的通信和数据交换提供了一些机制。
Buffers是在元件之间传递流的对象,Buffers从sources传到sinks(顺流)。
Events是在元件之间或者从应用程序到元件之间传递的对象。Events可以顺流也可以逆流。顺流Events可以同数据流同步。
Messages是被元件发送到管道消息总线上的对象,在总线上它们将会被应用程序收集。在一个安全线程中,Messages用来传递元件产生的像errors,tags,state changes, buffering state, redirects等的信息到应用程序。
Queries允许应用程序从管道中请求诸如像duration或者current playback position的信息。
管道通信流,如图1所示。
本系统硬件平台,CPU采用ARM Coretex A9 Dual,1G RAM,1G ROM,运行经裁剪的适应目标板的Linux操作系统;外围硬件接口包括SATA、CF卡接口、USB、RS232、VGA
、Audio接口、电源接口。可以支持外接硬盘、外接CF卡、外接VGA显示器等,满足基本的音视频播放功能。
2.2.1 操作步骤
在本系统中,音频播放器处理mp3音频文件。构建音频播放器的操作步骤如下所示:
(1)根据需求定义GStreamer框架中的类对象:
GstElement*m_Pipeline; //定义管道元件
GstBus *m_Bus; //定义总线
GstElement*m_Audiosink; //定义音频输出元件
GMainLoop  m_Loop;//定义循环
gdouble m_Volume; //定义音量。
(2)调用gst_init方法对GStreamer框架进行初始化操作:
gst_init_check(NULL, NULL, NULL))。
(3)调用gst_element_factory_make方法创建一个管道元件对象:
m_Pipeline=gst_element_factory_make(quot;playbin2quot;,quot;playerquot;)。
(4)调用gst_element_factory_make方法创建一个音频输出元件对象:
m_Audiosink=gst_element_factory_make(quot;alsasinkquot;,quot;audiosinkquot;)。
(5)调用gst_pipeline_get_bus方法,从管道中获取总线对象,并对总线设置消息回调函数:
m_Bus=gst_pipeline_get_bus(GST_PIPELINE(m_Pipeline))。
gst_bus_add_watch(m_Bus,bus_call,amp;bus_data);(6)定义(5)中的消息回调函数:
static gboolean bus_call(GstBus *bus,GstMessage*msg,gpointer data)。
在该消息处理函数中,主要捕获GST_MESSAGE_EOS消息与GST_MESSAGE_ERROR消息。分别处理文件播放完毕与播放时遇到错误的情况。
2.2.2 Qt程序处理流程
将播放器嵌入到Qt程序中,通过Qt界面,可以对播放器进行播放、暂停、停止、快进、快退、音量调节、播放进度的查询操作。Qt程序处理流程,如图2所示。
(1)播放
a.调用gst_element_set_state对管道设置播放状态。
gst_element_set_state(m_Pipeline, GST_STATE_PLAYING);
b.若设置成功,则使播放器进入循环状态,g_main_loop_run(bus_data.m_Loop)。
(2)暂停调用gst_element_set_state对管道设置暂停状态。gst_element_set_state(m_Pipeline, GST_STATE_PAUSED)。
(3)停止
调用gst_element_set_state对管道设置空。
gst_element_set_state(m_Pipeline, GST_STATE_NULL)。
(4)快进
a.调用gst_element_query_position查询管道当前的播放时间;
b.将当前播放时间加上一定的值;
c.gst_element_seek接口函数设置指定的播放时间,从而实现快进操作。
(5)快退
a.调用gst_element_query_position查询管道当前的播放时间;
b.将当前播放时间减去一定的值;
c.gst_element_seek接口函数设置指定的播放时间,从而实现快退操作。
(6)音量调节
a.设置当前音量m_Volume的值;
b.调用g_object_set接口对播放器设置音量,

本文发布于:2024-09-21 16:19:25,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/2/95985.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:元件   播放器   播放   系统   管道
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议