APP下载

基于FFmpeg和SDL的多路视频播放器设计与实现

2016-06-07刘文华

漳州职业技术学院学报 2016年1期

刘文华

(漳州职业技术学院计算机工程系,福建漳州363000)



基于FFmpeg和SDL的多路视频播放器设计与实现

刘文华

(漳州职业技术学院计算机工程系,福建漳州363000)

摘要:针对大屏彩色LED多媒体广告设备,以及其他类似的数字标牌设备对多视频同屏播放的需求,设计和实现了基于FFmpeg和SDL的多路视频播放器。播放器包含了一组FFmpeg解码器,能够同时对多路视频进行解码、缩放、色彩变幻等操作,并有效地降低播放器对嵌入式系统的资源消耗。本设计采用了SDL多媒体开发包及扩展库、FFmpeg视频解码等技术,因此该软件的跨平台可移植性和兼容性较高。

关键词:FFmpeg; SDL;多路显示; LED显示技术

引言

随着LED多媒体广告的普及和发展,多媒体广告设备的功能越来越强大,用户对多媒体广告设备的要求也越来越高。各种多媒体技术及其应用程序被应用到了LED多媒体广告业务中,是否能够播放更多的音视频是人们衡量LED多媒体广告设备的基本要求之一。而在很多的LED多媒体广告业务中要求设备能够同时播放多段音视频流,这对广告设备及视频播放器应用的性能都有很高要求。本文提出了一种基于FFmpeg的多路视频播放器的解决方案,使多媒体播放器能够容易的同时播放多段视频,并有效地降低播放器对嵌入式系统的资源消耗。

1 FFmpeg简介

FFmpeg[1]是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件);是自由软件中最完备的—套多媒体支持库,它几乎实现了所有当下常见的音视频编解码器以及多媒体传输协议。因此,对于从事多媒体技术开发来说,FFmpeg是最佳选择。相关数据结构包括AVFormatContext、AVStream、AVInputFormat、AVCodecContext、AVCodec、AVPacket、AVFrame与AVPicture等。

2 视频播放流程

应用ffmpeg库播放视频流程包括打开视频流、找到解码器、解码与显示等几个环节,如图1[2]。

2.1打开视频流

播放器首先注册解码器、初始化SDL[3]并打开视频流文件,找出视频流信息并初始化视频解码器,初始化的数据结构为VideoState *is、AVFormatContext* ic、AVStream *video_st、AVCodec* codec和AVCodecContext* c等。

2.2打开解码器

打开视频编解码codec、分配输出流缓存大小、分配每一帧图像缓存大小。

2.3视频解码

播放器分别创建3个处理线程read_thread、video_thread和音频处理线程。其中read_thread线程从原视频文件中读取视频帧,并将帧放进包队列中:

2.4视频显示

当视频播放器解码视频第一帧的时候创建SDL视频窗口,如下:

然后,播放器创建刷新线程refresh_thread,进入事件处理循环event_loop。refresh_thread线程按照设定的视频同步方法发出FF_REFRESH_EVENT事件,而event_loop接收到FF_REFRESH_EVENT事件并通知video_refresh刷新视频窗口。

刷新窗口时,先计算视频显示区域,并调用SDL_DisplayYUVOverlay函数刷新显示窗口:

2.5关闭

播放器播放到文件结尾并且循环次数为1或者播放器被用户关闭时,产生FF_QUIT_EVENT事件。事件循环event_loop接收FF_QUIT_EVENT事件后调用do_exit函数关闭read_thread、video_thread、refresh_thread等线程,释放数据缓冲区并退出事件循环event_loop,最后调用SDL_Quit关闭SDL。

图1 视频播放流程

3 多路播放器设计

不同于单实例视频播放器[4],多路播放器需要特别的设计:显示设备支持对应多个视频的多窗口、显示设备支持刷新多个窗口的多线程、控制多视频播放流程的事件循环[5]等。

3.1SDL显示设备

在ffmpeg播放器的构造函数中,应用SDL_CreateYUVOverlay函数创建播放窗口并实例化解码器。构造多路视频播放器的显示设备时,分配窗口为多个子窗口,创建解码器实例数组并将子窗口位置传入到各解码器实例中。

各解码器实例调用SDL_CreateRGBSurface构造视频播放缓冲区,并调用SDL_CreateYUVOverlay创建与之关联的Overlay窗口,最后使用SDL_DisplayYUVOverlay刷新视频到缓冲区。

3.2SDL事件循环

SDL事件循环主要是循环处理视频帧的读取、解码和窗口刷新流程,以及用户的输入事件等。不同于单实例视频播放器准备好后直接进入其事件处理循环,多路视频播放器构造多个解码器实例后创建事件处理线程进入事件处理,支持多个视频播放实例的事件处理:

3.3刷新线程

不同于单实例视频播放器直接将视频刷新到播放窗口,多路视频播放器构造的多个解码器实例将视频刷新到视频缓冲surface,在播放器的刷新线程MaaThread中拷贝到播放窗口显示。

SDL_BlitSurface(mp[i].screen, NULL, window, &mp[i].ScreenRect);

4 多路播放器实现

4.1解码器类实现

ffplay播放实例程序中包含了大量的全局变量。为了实现播放器的多实例化、函数重进入性,将这些全局变量封装到解码器类MaaPlay中并添加多实例化相关属性。这些属性包括window(播放窗口)、window_width(播放窗口宽度)、window_height(播放窗口高度)、screen(播放缓冲区)、screen_left(播放区域坐标)、screen_top(播放区域坐标)、screen_width(播放区域宽度)、screen_height(播放区域高度)、ScreenMutex(视频缓冲区刷新互斥量)等,类的实现如程序1。

解码器类添加构造函数MaaPlay和prepare函数。构造函数传入视频播放窗口、视频播放窗口宽和高、视频缓冲刷新互斥量等,prepare函数初始化VideoState等结构体、设置播放缓冲区宽高和位置、播放文件名等其他播放参数。prepare函数不调用event_loop进入事件处理循环。

程序1解码器类实现

4.2播放器类实现

播放器类定义如下,主要包括解码器实例数组、播放窗口、视频事件处理循环线程、播放窗口刷新线程及其初始化函数OnMaaInit等,如程序2。

在播放器应用程序类成员函数OnMaaInit中,调用SDL_Init函数初始化SDL模块、av_register_all注册视频解码器、SDL_setVideoMode函数构造视频播放窗口window并设置其宽高;然后函数构造多个解码器实例保存在MaaPlay数组中,并调用SDL_CreateThread构造ScreenEventThread事件处理线程进入事件处理循环;最后函数调用SDL_CreateThread函数构造MaaThread播放窗口刷新线程,刷新线程按照固定时间间隔MaaInterval调用SDL_BlitSurface拷贝视频缓冲区到播放窗口并调用SDL_Flip函数刷新播放窗口。播放器应用类的MaaThread刷新线程与各解码器实例的refresh_thread刷新线程使用ScreenMutex保持对视频缓冲区的互斥使用。

程序2播放器应用实现

图2 改进的视频播放流程

5 实验结果

在此实验中,播放器创建宽640高480的播放窗口,初始化两个视频并创建事件处理线程和窗口刷新线程,程序如下:

分别在播放窗口的(0,0)处添加一个视频播放区,播放区域宽320,高240,播放起始时间0秒,播放时长1000秒,允许音频输出,循环次数为3次,播放文件coco.mp4文件;在播放窗口的(320,240)处添加一个视频播放区,播放区域宽320,高240,播放起始时间0秒,播放时长1000秒,不允许音频输出,循环次数为3次,播放文件fight.mp4文件。程序运行结果如图3。

6 结语

将开源的ffmpeg库封装成C++解码器类,独立出SDL播放窗口和事件处理循环,从而实现了ffmpeg库的多实例化。在应用程序实现中初始化了多个解码器实例,实现了多个视频同窗播放。

参考文献:

[1]郭玉霞. FFMPEG SDK结构分析[J].计算机与网络,2013(11):48-50.

[2]解梅,张自然.SDL软件设计技术研究[J].电子科技大学学报,2003(2):61-63.

[3] http://xcshen.blog.51cto.com/2835389/565929[EB/OL].

[4]赵宏,尹磊,曹洁,申超.多媒体终端的设计与实现[J].科学技术与工程,2010(22):5420-5425.

[5]李耀华,张贻雄,阮铭清.基于DirectFB的嵌入式播放器设计[J].单片机与嵌入式系统应用,2012(3):53-55.

(责任编辑:季平)

Design and Implementation of Multiplex Video Player Based on FFmpeg and SDL

LIU Wen-hua

(Zhangzhou Institute of Technology, Fujian Zhangzhou 363000, China)

Abstract:Aiming at the LED multimedia advertising equipment with large and full-color screen, and the other similar digital equipment which has requirements of multiplex display on a signal screen, We design and implement the multiplex video player based on SDL and FFmpeg technology. Including a set of FFmpeg decoder, the player can decode, zoom, modify colors on multiplex video at the same time. The design can effectively reduce system resources consumption which is significant for embedded system. At the other hand, this design has high cross platform portability and compatibility, because of applicationof SDL multimedia development kit and extended library, and FFmpeg video decoding technology.

Key words:FFmpeg; SDL; multiplex display; LED

中图分类号:TP311.1

文献标识码:A

文章编号:1673-1417(2016)01-0001-06

doi:10.13908/j.cnki.issn1673-1417.2016.01.0001

收稿日期:2015-12-10

基金项目:省教育厅B类课题(JB12326);漳州职业技术学院科研计划资助项目(ZZY1203)

作者简介:刘文华(1980—) ,男,山东莒南人,讲师,硕士,研究方向:嵌入式系统和应用设计。