滕志军,徐艳伟
(东北电力大学信息工程学院,吉林 吉林 132012)
基于Qt的跨平台多媒体播放器的设计与实现
滕志军,徐艳伟
(东北电力大学信息工程学院,吉林 吉林 132012)
基于Qt Creator图形界面开发环境,采用以音频时间戳为基准的音视频同步播放方案,并利用FFMPEG+SDL解码播放视频,设计了一种跨平台的嵌入式多媒体播放器.经实验证明,该播放器能够很好地支持多种格式的媒体文件播放,系统性能稳定,与当前流行的播放器相比较,在软件启动时间、CPU占用率、内存占用空间、流畅度以及音视频同步效果等方面均具有明显的优势,是一款高性价比的跨平台多媒体播放终端.
Qt;跨平台播放器;FFMPEG解码;同步播放
伴随着当今社会、经济、科技的快速发展,计算机技术和多媒体技术不断革新,人们对于知识、新鲜事物的获取途径也越来越多样化.视频利用其自身所具有的直观、生动的优势被人们所广泛使用.功能多样化是现代嵌入式终端设备的优势特点之一,而视频播放作为其中一种最具代表性的功能特性被广泛用于智能设备终端并成功应用于各个领域,如休闲娱乐、文体办公、医疗保健、智能监控等.
当前,嵌入式系统正处在一个飞速发展和激烈竞争的时代,终端多样化为整个嵌入产业的发展提供了更加广阔的发展空间.当然在智能设备终端领域机遇与挑战并存,常见的智能手机、平板电脑等设备升级换代速度较快,新产品与旧产品在软硬件和平台的标准规格等方面有较大差异,比如Android平台不同设备厂家生产的设备硬件差异巨大,即使同一厂家生产的设备其高端机与低端机在硬件方面也有较大差异,且兼容软件版本各异.被微软收购的诺基亚公司生产的智能手机的不同硬件规格的设备分别使用了Symbian,MeeGo和Windows Phone等软件平台,因此如果能开发一款可以同时跨多个平台的终端软件,将节约巨大的开发成本和开发时间[1-2].
本文基于Qt Creator图形界面开发环境,对多媒体播放器进行了开发研究.主要面向PC以及Android,iOS和Symbian智能手机或平板电脑,支持Windows和Linux操作系统以及大部分Android,iOS和Symbian操作系统.重点研究了跨平台多媒体播放器开发中的关键技术(FFMPEG的解码以及音频和视频的同步播放技术),并据此开发出高性价比的跨平台多媒体播放终端(Cross-platform multimedia player,简称CPMPlayer).
Qt[3]是由诺基亚公司开发的一款强大的C++图形用户界面应用程序框架开发平台.它可以为开发者提供完整建立艺术级的图形用户界面所需的功能.Qt是覆盖移动系统平台最广的跨平台开发框架,具有广泛的适应性和良好的可移植性,同样的代码只需在不同平台系统环境下编译,可实现应用程序对多个平台的兼容.Qt支持多种移动终端平台,包括Symbian,Ubuntu,BlackBerry,MeeGo,Android和iOS.不仅如此,Qt还支持多种桌面开发系统和嵌入式开发,包括Windows的大部分版本及Unix/X11-Linux,Sun Solaris,HP-UX,Compaq Tru64 UNIX,IBM AIX,SGIIRIX和X11平台.
Qt能在桌面与嵌入式平台上开发先进的GUI应用程序,实现所有需要的功能.Qt与OpenGL紧密集成完美支持3D图形并支持创建应用程序用户界面,其跨平台多线程功能简化了并行编程,利用信号与槽机制[4]实现跨线程类型安全的对象间通信.Qt支持所有重要的数据驱动,可以无缝链接数据库与Qt应用程序.
Qt Creator是一个全新的、完整的、轻量级的跨平台Qt集成开发环境,确保首次接触Qt框架的开发人员能迅速上手和操作.Qt Creator包含一个高级的C++代码编辑器、上下文感知帮助系统、可视化调试器、源代码管理、项目和构建管理工具用于开发和测试基于Qt的应用程序.
基于Qt的跨平台多媒体播放器系统的总体设计框架如图1所示.用户通过由Qt Creator开发的图形客户端打开存放有媒体源的文件夹,系统会自动搜索显示相应的媒体文件信息,FFMPEG对媒体文件进行解码并由SDL辅助视频文件显示到客户端上.整个系统可以流畅播放MP3,WMA和WAV等格式的音频文件,以及AVI,MP4,FLV和RMVB等格式的视频文件,并且具有快进、快退、暂停、播放列表等功能,支持历史记录播放.系统相比其他播放器具有占用内存小、反应速度快、播放效果好等优点.
图1 系统结构原理
传统的多媒体文件解码方式有Any Chat,GSTREAMER,FFMPEG,FFDSHOW,VFW和DIRECTSHOW等,由于FFMPEG的功能强大和编解码速度较高,目前得到了普遍的应用[5].本文采用FFMPEG来实现音视频的解码,同时为了简化音视频处理的难度,采用SDL优化媒体文件的显示播放效果.
3.1 FFMPEG解码流程
FFMPEG是在Linux下开发可用来采集和转换数字音视频并将其转换为流畅的自由软件.它允许在包括Windows和Mac OS X在内的大多数操作系统中编译.包含libavcodec音频和视频解码器库以及libavformat音频与视频格式转换库[6].为了缩小执行文件本身的体积以及节省系统资源,本文设计选择在Windows下对FFMPEG采用动态编译.
媒体文件的解码流程如图2所示,FFMPEG主要有编解码模块、混合器模块和内存操作模块.编解码模块主要是encode和decode,用于音视频的编码和解码,存放在libavcodec子目录中;混合器模块主要是muxer和demuxer,用于分离与合并音、视频,存放在libavformat目录中[7];内存操作主要是修改libavutil目录中的mem.h和mem.c文件,目的是标记从堆上动态分配的内存块的地址以及这些内存的释放情况,避免内存泄漏的发生.FFMPEG利用extradata/extradata_size缓冲器存放解码器可能会用到额外信息,在av_read_frame中填充.解码基本流程大体可分以下几步:
(1) 注册encode/decode和muxer/demuxer容器.函数av_register_all(void)把获取的FFMPEG支持的编码器、解码器以及混合器的相关信息以链式结构存放在内存中.
(2) 打开视频文件.函数av_open_input_file()打开文件、侦测容器文件格式.
(3) 获取视频属性信息.首先利用函数av_find_stream_info()从文件中获取流(stream)信息并通过av_read_frame()不停地从码流中提取帧数据保存在容器中,找到codec_type_video类,进而根据av_find_decoder()函数查找与其对应的编解码器.
(4) 分配图像缓存,获取图像.通过avcodec_open函数打开编解码器,函数avcode_alloc_frame()用于申请内存空间,通过特定函数 avcodec_decode_video解码一帧视频.使用avcodec_close()释放内存和解码器,避免内存泄漏.
(5) 返回到步骤(3),直到解码完毕.
(6) 关闭视频文件
图2 FFMPEG解码流程
3.2 SDL实现音视频播放
SDL(Simple DirectMedia Layer)是一套基于C语言编写,采用抽象封装方式并开放源代码的跨平台多媒体开发库.SDL提供多种处理图像和声音的函数,API设计简单,能很好地在C++等高级语言环境中使用,是一个跨平台图像显示库.目前SDL多用于开发游戏、模拟器、媒体播放器等多媒体应用领域[8].
利用SDL实现画面输出到屏幕.使用SDL_Init()函数初始化SDL库;使用SDL_SetVideoMode()函数创建一个给定高度和宽度的屏幕,并设置屏幕的颜色深度.建立一个AVPicture结构体,设置它的数据指针和行尺寸参数.SDL_AddTimer(delay,sdl_refresh_timer_cb,is)会让sdl_refresh_timer_cb函数把视频播放的各种信息传递给回调函数sdl_refresh_timer_cb,然后事件监听模块监听到数据.通过SDL_LockMutex和SDL_UnlockMutex函数保证线程协调变量的读写安全;SDL_CondWait和SDL_CondSignal函数来阻塞和解除阻塞.
利用SDL实现音频输出.输出声音采用函数SDL_OpenAudio()打开声音设备,使用SDL_AudioSpec结构体作为参数,它包含了要输出的音频的所有信息.
在Qt Creator中利用下面2条语句获得画面框架,并输出显示到屏幕上.
QPixmap pixmap=QPixmap::fromImage(image.scaled(ui->label->size(),Qt::KeepAspectRatio));
ui->label->setPixmap(pixmap);
音频和视频的同步技术是多媒体播放系统中一项极为关键的技术,它对客户体验的好坏具有直接而深刻的影响.同步的目的在于展示媒体信息时,能够保持媒体与对象之间固有的时间关系.通常情况下音视频的同步分2种情况:一是流内同步,其主要任务是保证音频流或视频流单个媒体流内的时间关系,以满足用户的感知需求;另一种是流间同步,目的就是保证音频流和视频流之间的时间关系.[9]
4.1 音频和视频的同步播放流程
本文采用以音频播放的时间为基准(如图3所示),即根据音频播放的时间确定当前的图像是否“迟到”.如果发生了“图像迟到”,首先要加快数据帧的刷新频率,同时启动跳帧策略,通知解码器以适当的频率在解码后输出图像,直至重新恢复同步;同样若“图像早到”,则加倍计算延迟,直到重新恢复同步.这样就实现了音频和视频的同步.
图3 音视频同步播放流程
4.2 时间漂移问题的处理
影响音视频同步的一个重要因素就是时间漂移的问题.为了更好地解决同步过程中产生的时间漂移,本文对不同情况采取不同的策略:对于固定速率的媒体文件,采取的策略是将视频的帧率及音频的比特率置于文件的首部;对于变速率的媒体文件,采取的方案是将视频的帧率和音频的比特率等信息嵌入到媒体流的内部.
实验证明,所采取的策略能有效地消除音视频同步播放过程中产生的时间漂移所带来的影响.
4.3 快进、快退下的同步播放
众所周知,用户在观看一部媒体文件时,若不能对其进行全局搜索是一件非常遗憾的事情.出于这方面的考虑,本文为多媒体播放器的设计增加了一些快进、快退功能.对多媒体播放器的快进、快退等功能的实现采用一种基于时间的随机访问方案,即将媒体文件读写指针定位到某个给定的时间点上,然后调用av_read_frame就能够读取时间标签,等于给定时间点的媒体数据.快进、快退功能的实现有2种方式:一是通过移动进度条的位置来实现对媒体文件的搜索定位;另一种方法就是在媒体文件播放中使用左方向键和右方向键来表示向前和向后一小段.经过反复实验前进、后退一小段设置为10 s较为合适.
图4 CPMPlayer播放界面
完成软件的设计调试后,相比Linux,Andriod,Windows,Symbian和IOS等系统本文选择具有代表性的Windows平台进行测试运行.测试环境为Win 7操作系统、英特尔Core i5双核处理器、4GB三星DRR3 1 067 Hz内存、Nvidia GeForce 310 MB 1 GB显卡、ConexantSmartaudio HD声卡.软件显示界面如图4所示.
为了更直观地表现出该方案的可行性与高效性,本文选取了几种现阶段较流行的播放器,在软件启动时间、CPU占用率、内存占用空间、流畅度以及音视频同步效果等方面进行了比对(见表1).通过表1的数据可以很直观看到基于Qt的多媒体播放器(CPMPlayer)在以上几方面均占有一定的优势.
表1 主流多媒体播放器性能对比
本文的创新点是系统具有很好的跨平台性,并提出了基于FFMPEG和SDL的解码显示技术以及高性能的音视频同步方案.以此设计的多媒体播放系统的实现过程以及核心的代码对类似平台具有很好的可重塑性,代码通过较小的修改并在不同的平台编译就可以移植到不同的操作系统和平台上运行.软件占用内存小、运行效果好、开发成本低,能够很好地满足用户需求,具有较高的经济价值.
[1] 马燕,李存,李晓勇,等.基于ARM平台的多媒体播放器的设计与实现[J].计算机工程,2006,32(24):221-222,268.
[2] 陆钢,朱培军,李慧云,等.智能终端跨平台应用开发技术研究[J].电信科学,2012(5):14-17.
[3] JASMIN BLANCHETTE,MARK SUMMERFIELD.C++ GUI Qt 4编程[M].闫锋欣,译.北京:电子工业出版社,2008:5-120.
[4] 刘治国,陈新华.基于Linux和Qt的智能家居系统的设计与实现[J].电子技术应用,2012,38(4):23-26.
[5] 梁发云,陈志文,王婧,等.基于FFmpeg的立体视频播放技术研究[J].电视技术,2013,37(11):27-29+42.
[6] 辛长春,娄小平,吕乃光.基于FFmpeg 的远程视频监控系统编解码[J].电子技术,2013(1):3-5.
[7] 吴张顺,张珣.基于FFmpeg 的视频编码存储研究与实现[J].杭州电子科技大学学报,2006,26(3):30-34.
[8] 王园园,高明煜,曾毓.基于SDL库的嵌入式平台中文显示技术研究[J].计算机系统应用,2009,18(4):194-197.
[9] 魏耀都,谢湘,匡镜明,等.新的全参考音视频同步感知质量评价模型[J].通信学报,2012,33(2):182-190.
(责任编辑:石绍庆)
Design and implementation of cross-platform multimedia player based on Qt
TENG Zhi-jun,XU Yan-wei
(College of Information Engineering,Northeast Dianli University,Jilin 132012,China)
In this paper,under the development environment of Qt Creator graphical interface,a cross-platform embedded media player is designed by adopting audio and video synchronous playback scheme which is based on audio time stamp and using FFMPEG+SDL decoder to broadcast video.It is proved that the player is well able to support multiple formats of media file,the system performance is stable,compared with the current popular player,it has more obvious advantages in software startup time,CPU usage,memory footprint,fluency,and synchronization of audio and video effects,etc.This is a cross-platform multimedia player terminal with high cost performance.
Qt;cross-platform player;FFMPEG decoder;synchronous playback
1000-1832(2015)04-0059-05
10.16163/j.cnki.22-1123/n.2015.04.013
2014-08-03
国家自然科学基金资助项目(51277023).
滕志军(1973—),男,教授,博士,主要从事无线通信技术研究.
TP 37 [学科代码] 520·40
A