劉文華
(漳州職業技術學院計算機工程系,福建漳州363000)
?
基于FFmpeg和SDL的多路視頻播放器設計與實現
劉文華
(漳州職業技術學院計算機工程系,福建漳州363000)
摘要:針對大屏彩色LED多媒體廣告設備,以及其他類似的數字標牌設備對多視頻同屏播放的需求,設計和實現了基于FFmpeg和SDL的多路視頻播放器。播放器包含了一組FFmpeg解碼器,能夠同時對多路視頻進行解碼、縮放、色彩變幻等操作,并有效地降低播放器對嵌入式系統的資源消耗。本設計采用了SDL多媒體開發包及擴展庫、FFmpeg視頻解碼等技術,因此該軟件的跨平臺可移植性和兼容性較高。
關鍵詞:FFmpeg; SDL;多路顯示; LED顯示技術
隨著LED多媒體廣告的普及和發展,多媒體廣告設備的功能越來越強大,用戶對多媒體廣告設備的要求也越來越高。各種多媒體技術及其應用程序被應用到了LED多媒體廣告業務中,是否能夠播放更多的音視頻是人們衡量LED多媒體廣告設備的基本要求之一。而在很多的LED多媒體廣告業務中要求設備能夠同時播放多段音視頻流,這對廣告設備及視頻播放器應用的性能都有很高要求。本文提出了一種基于FFmpeg的多路視頻播放器的解決方案,使多媒體播放器能夠容易的同時播放多段視頻,并有效地降低播放器對嵌入式系統的資源消耗。
FFmpeg[1]是一個開源免費跨平臺的視頻和音頻流方案,屬于自由軟件,采用LGPL或GPL許可證(依據你選擇的組件);是自由軟件中最完備的—套多媒體支持庫,它幾乎實現了所有當下常見的音視頻編解碼器以及多媒體傳輸協議。因此,對于從事多媒體技術開發來說,FFmpeg是最佳選擇。相關數據結構包括AVFormatContext、AVStream、AVInputFormat、AVCodecContext、AVCodec、AVPacket、AVFrame與AVPicture等。
應用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 視頻播放流程
不同于單實例視頻播放器[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.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 改進的視頻播放流程
在此實驗中,播放器創建寬640高480的播放窗口,初始化兩個視頻并創建事件處理線程和窗口刷新線程,程序如下:

分別在播放窗口的(0,0)處添加一個視頻播放區,播放區域寬320,高240,播放起始時間0秒,播放時長1000秒,允許音頻輸出,循環次數為3次,播放文件coco.mp4文件;在播放窗口的(320,240)處添加一個視頻播放區,播放區域寬320,高240,播放起始時間0秒,播放時長1000秒,不允許音頻輸出,循環次數為3次,播放文件fight.mp4文件。程序運行結果如圖3。
將開源的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—) ,男,山東莒南人,講師,碩士,研究方向:嵌入式系統和應用設計。