www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 嵌入式 > 嵌入式軟件
[導讀]基于Qt的嵌入式媒體播放器系統(tǒng)的設計

1引言

隨著用戶要求的不斷提高,越來越多的嵌入式設備使用功能強大、價格低廉的嵌入式Linux作為操作系統(tǒng)并開始采用較為復雜的圖形用戶界面。Qt以其強大的功能、良好的可移植性逐漸成為一種被廣泛使用的GUI系統(tǒng)。正是由于嵌入式操作系統(tǒng)及其相應圖形用戶界面的不斷發(fā)展,嵌入式軟件的開發(fā)顯得越來越重要。其中嵌入式媒體播放器由于能夠滿足人們的視聽享受已經逐漸成為了系統(tǒng)中不可或缺的重要組成部分,在嵌入式系統(tǒng)上開發(fā)媒體播放器已經成為了一個技術熱點,當前許多嵌入式產品中都包含媒體播放器。因此在基于Qt的嵌入式系統(tǒng)中實現(xiàn)媒體播放器具有深刻的意義和實用價值。

2 嵌入式媒體播放器系統(tǒng)設計

2.1架構設計

嵌入式媒體播放器架構設計方案如圖1所示。通過使用純C++語言開發(fā)來支持嵌入式Linux系統(tǒng),采用Qt/Embedded作為GUI來提供強大的用戶界面,實現(xiàn)一個開放式的插件接口來增強擴展性,利用內核幀緩沖來輸出,消除對特定架構的依賴,從而保證可移植性。媒體播放器屬于上層應用程序,位于Linux用戶空間。這樣設計的目的是為了系統(tǒng)移植性。

圖形用戶界面窗口以Qt/Embedded為基礎開發(fā),通過調用Qt/Embedded提供的類庫根據(jù)需要設計可以管理多媒體文件的基本窗口,包括打開、刪除、顯示文件長度、顯示播放時間等窗口,以及為方便用戶設定的管理播放列表、進行播放控制的窗口,這些都是直接和用戶打交道的。由于采用了Qt/Embedded作為GUI,移植性可以得到保證。

文件輸入主要是對用戶指定的文件進行讀取和解析,將獲得的文件長度、播放時間、編碼格式、音視頻幀率、文件標題等內容,結合MIME的處理,顯示在預先設計的窗口中。

插件接口調用主要是把所有對解碼器的操作整合到一個統(tǒng)一的開放式接口當中,根據(jù)上一部分解析出的文件信息去查找相應的解碼器插件并調用,如果沒有找到可用的解碼器可以返回信息提醒用戶添加相應的插件。通過實現(xiàn)這樣一個接口可以使播放器的擴展性大大提高,因此本部分是媒體播放器的核心。

文件解碼和輸出主要負責通過調用解碼器對音視頻數(shù)據(jù)流進行解碼,然后利用QT/Embedded可以直接操縱內核幀緩沖FrameBuffer的特性,將解碼之后的數(shù)據(jù)通過FrameBuffer直接送到輸出設備輸出,避免對DirectShow、OpenGL等特定架構的依賴,進一步增強可移植性。

圖1 嵌入式媒體播放器的架構

3 插件接口模塊和解碼庫模塊

3.1插件接口模塊設計

插件接口模塊是整個播放器的核心部分,它封裝了對具體解碼器的操作,從而在輸入和輸出模塊之間搭起一座橋梁,確保數(shù)據(jù)的正常流動。插件接口模塊主要提供了以下方法來控制解碼器:

1)文件支持性函數(shù) bool isFileSupported(const QString&filename);

通過檢查文件的擴展名來確定待播放的文件是否被播放器支持,若是返回真,否則返回假??勺R別的擴展名有asf、avi、dat、mp2、mp3、mpeg、mpg、ogg、wav等。如果添加了新的解碼器插件以后可以識別新的文件格式,只需要將其擴展名添加到此函數(shù)的支持列表中[!--empirenews.page--]

2)獲取文件信息函數(shù) const QString&  fileInfo();

用于獲得文件的各種信息并將結果保存在一個常量字符串中,便于其他函數(shù)調用。這些信息包括:播放時間、音頻格式、音頻比特率、音頻通道、音頻頻率、視頻格式、視頻比特率、視頻高度、視頻寬度等。

3)讀取音頻采樣函數(shù)

bool audioReadSamples(short* output , int channels, long samples, long& samplesRead, int);

調用解碼器對音頻采樣數(shù)據(jù)進行讀取,是音頻數(shù)據(jù)處理的核心部分。output表示待輸出文件指針,channels表示通道數(shù),samples表示采樣數(shù),samplesRead表示待讀取采樣數(shù)

4)讀取視頻幀函數(shù)

bool videoReadScaledFrame(unsigned char** output_rows, int, int, int in_w, int in_h,int out_w,int out_h,ColorFormat fmt,int);

調用解碼器對視頻幀進行讀取,是視頻數(shù)據(jù)處理的核心部分。參數(shù)output_rows表示輸出列地址的指針,in_w、in_h、out_w、out_h分別表示輸入和輸出幀數(shù)據(jù)的寬度和高度,fmt表示采用的色彩模式,返回值用來判斷執(zhí)行是否成功。

5)音視頻同步函數(shù)定義:int Sync(File*fp,int auIndex,struct timeval*vtime);

fp為打開的多媒體文件指針,vtime為當前正在播放的視頻文件的幀頭中提取的時間, auIndex指出當前的音頻幀計數(shù),即當前播放到了第幾幀。通過這些參數(shù)就可以計算出希望跳到的幀數(shù)和當前幀數(shù)的差值,然后根據(jù)這個差值將音頻流向前(滯后)或向后(超前)跳即可。同時Sync函數(shù)還會將此差值int反饋給音頻解碼器,讓音頻解碼器修正數(shù)據(jù)流的時間戳,如此循環(huán),從而達到較好的音視頻同步效果。此函數(shù)的總體思想是在播放視頻數(shù)據(jù)流的同時啟動另一線程,打開對應的音頻數(shù)據(jù)流播放,然后在視頻線程中來同步音頻數(shù)據(jù)。

此外還有插件初始化和注冊函數(shù) void pluginInit()、文件初始化函數(shù) void fileInit()、查找函數(shù) bool seek(long pos)、清空視頻數(shù)據(jù)函數(shù)flushVideoPackets()和清空音頻數(shù)據(jù)函數(shù)flushAudioPackets()、獲取下一數(shù)據(jù)包函數(shù) MediaPacket*getAnotherPacket(int stream)等,不再做詳細介紹。

3.2解碼庫模塊

解碼庫模塊的主要作用是為插件接口模塊提供解碼器,考慮到播放器的可移植性和可擴展性,本系統(tǒng)采用了ffmpeg解碼庫。FFmpeg解碼庫是Linux下的一個開源解碼器集合,它支持多種音頻和視頻編解碼標準,還支持轉文件格式、制作avi等,功能十分強大??梢栽趙indows下使用的ffshow插件,linux下的mplayer播放器都是使用的ffmpeg解碼庫。

解碼庫又包含解碼器和分離器。解碼器就是對音視頻數(shù)據(jù)流進行解碼的組件,分離器就是把文件流中的數(shù)據(jù)分離為音頻數(shù)據(jù)流和視頻數(shù)據(jù)流的組件,音頻數(shù)據(jù)和視頻數(shù)據(jù)是分開解碼的,所以二者缺一不可。

3 嵌入式媒體播放器系統(tǒng)實現(xiàn)

3.1 數(shù)據(jù)流程總體設計

圖2為系統(tǒng)數(shù)據(jù)流程:首先輸入模塊從數(shù)據(jù)源(多媒體文件)讀入數(shù)據(jù),此時它將讀入文件頭,做一些基本的處理,如讀出文件長度,獲取此文件的編碼類型、比特率,判斷能否播放等;然后插件接口模塊會調用分離器插件將多媒體數(shù)據(jù)切分為視頻數(shù)據(jù)流和音頻數(shù)據(jù)流;再經過視頻FIFO和音頻FIFO,排序處理;最后送入視、音頻解碼器調用相應的解碼器進行解碼,對于音頻數(shù)據(jù)就會進行重采樣,對于視頻數(shù)據(jù)就會讀取相應的幀,逐幀解碼;之后經過采樣的音頻數(shù)據(jù)和經過渲染覆蓋的視頻數(shù)據(jù)先進行音視頻同步,再分別通過視、音頻輸出模塊輸出。這其中,數(shù)據(jù)的讀入、分離、解碼、輸出都是通過Qt提供的類庫以多線程同時進行的,在解碼得同時程序也在不斷將數(shù)據(jù)讀入緩沖區(qū)并排序等待處理,以提高效率。

輸入模塊的主要功能是將用戶指定的多媒體文件讀入。由于不同格式的多媒體文件需要調用不同的解碼器才能正常打開,因此考慮到程序的模塊化將實際的文件打開工作交給插件接口模塊調用相應的解碼器進行,輸入模塊只對文件進行一些基本的處理并對文件內容進行緩存,然后為插件接口模塊輸送原始數(shù)據(jù)流。用戶首先通過圖形用戶界面選定待播放文件發(fā)出打開指令,這將會使輸入模塊接收到一個信號并通過用戶界面?zhèn)骰氐男畔@得待播放文件的文件路徑和文件名。接下來輸入模塊會檢查文件路徑是否合法、文件是否為空,之后會向插件接口模塊發(fā)出信號,通知插件接口模塊查找可用的解碼器,為文件解碼做好準備。下一步就是進行調用播放初始化函數(shù)init(),其具體過程下面會詳細介紹,最后就是將工作移交給插件接口模塊,讓它調用對應文件格式的解碼器的open()函數(shù)。

輸出模塊的主要功能是將通過解碼器解碼之后的音頻、視頻數(shù)據(jù)送到輸出設備(如LCD顯示屏、揚聲器)輸出。根據(jù)輸出內容的不同可以將輸出模塊劃分為音頻輸出和視頻輸出兩個子部分。這兩個部分基本上是相互獨立輸出的,通過插件接口模塊的同步控制讓它們在輸出時保持同步。視頻輸出和音頻輸出稍有不同,它利用Qt/Embedded可以直接控制FrameBuffer的特性來輸出視頻數(shù)據(jù)。幀緩沖區(qū)是顯卡上的內存,使用幀緩沖區(qū)可以提高繪圖的速度和整體性能,與幀緩沖區(qū)有關的設備是/dev/fb0(主設備號29,次設備號0)。[!--empirenews.page--]

圖2 系統(tǒng)數(shù)據(jù)流程

4.2嵌入式音視頻同步設計

本方法的基本思想是以視頻流為主媒體流,音頻流為從媒體流,視頻的播放速率保持不變,根據(jù)本地系統(tǒng)時鐘確定的實際顯示時間,通過調整音頻播放速度來達到音視頻同步。整個系統(tǒng)的音視頻同步數(shù)據(jù)流程見圖3。首先選擇一個本地系統(tǒng)時鐘參考(LSCR),要求本地系統(tǒng)時鐘參考上的時間是線性遞增的。然后將LSCR分送到視頻解碼器和音頻解碼器,由這兩個解碼器根據(jù)各幀的PTS值對照本地系統(tǒng)時鐘參考產生各幀準確的顯示或回放的時間。也就是說,生成輸出數(shù)據(jù)流時依據(jù)本地參考時鐘上的時間給每個數(shù)據(jù)塊都打上時間戳(一般包括開始時間和結束時間)。在播放時,讀取數(shù)據(jù)塊上的時間戳,同時根據(jù)本地系統(tǒng)時鐘參考上的時間來安排播放。

圖3 音視頻同步數(shù)據(jù)流程

基于時間戳的播放過程中,僅僅對早到的或晚到的數(shù)據(jù)塊進行等待或快速處理,往往是不夠的。如果想要更加主動并且有效地調節(jié)播放性能,就需要引入反饋機制,也就是通過對比音視頻的時間戳將當前數(shù)據(jù)流的播放狀態(tài)反饋給上層的“源”。如果音頻流滯后,就即時通知音頻解碼器加快音頻流輸出,但是如果滯后太多,則直接將當前數(shù)據(jù)丟棄,直接跳到下一幀;如果視頻流滯后,就通知音頻解碼器減慢音頻輸出速度等待視頻流,如滯后太多也直接進行跳幀。數(shù)據(jù)流首先通過分離器分解為視頻數(shù)據(jù)流和音頻數(shù)據(jù)流,然后經過對應的解碼器,同時由本地系統(tǒng)時鐘來進行時間戳控制;獲得準確顯示或回放時間以后進行時間戳比較;若同步則直接輸出,不同步則進行音頻跳幀或等待,直到同步后輸出。

 

5 總結

本文的創(chuàng)新點是系統(tǒng)具有很好的可移植性,它的實現(xiàn)過程以及核心的代碼對類似應用具有很好的可重用性,只需通過較小的修改就能移植到不同的操作系統(tǒng)和平臺上,可以廣泛使用在各種嵌入式系統(tǒng)中,如PDA,智能手機等方面,具有較高的經濟價值,同時也可以為開發(fā)其他嵌入式系統(tǒng)軟件提供參考意見;其次,本文圍繞用戶的基本需求,提出了一個基于嵌入式Linux操作系統(tǒng)和圖形用戶界面QT/Embedded的媒體播放器設計方案。該設計方案具有低耦合、高內聚、可擴展、可移植等良好特點,并在設計的基礎上將該方案實現(xiàn)。該媒體播放器支持編碼格式為MPEG-1、MPEG-2和MPEG-4的多媒體文件。同時具有存儲空間小,響應速度快的性能特點,并支持播放控制、播放列表等功能,可自由切換中英文雙語界面,用戶可以選擇打開任意位置的文件。項目經濟效益50萬元。

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

經過幾十年發(fā)展,嵌入式技術已經用在了我們生活中的方方面面,但是嵌入式始終都帶有小眾,專業(yè)性強的屬性,讓很多非嵌入式領域的同學望而卻步。近十幾年的發(fā)展,物聯(lián)網覆蓋了越來越多領域,包括了家居,商業(yè),工業(yè),農業(yè)等領域,不僅吸引...

關鍵字: 嵌入式 物聯(lián)網 技術

隨著IT技術飛速發(fā)展,互聯(lián)網已經進入了“物聯(lián)網”時代。物聯(lián)網中需要的大量設備不在依賴人與人之間的交互產生聯(lián)系,更多通過協(xié)議、通信、程序設計等方式連接到一處。即 “物聯(lián)網”的目的則是讓所有的物品都具有計算機的智能但并不以通...

關鍵字: 嵌入式 物聯(lián)網 計算機

最近看到APP上,給我推送了很多類似的回答,借此機會,也想著重新審視一下自己的學習歷程,以及結合自身和大牛,分享一些學習經驗,希望對大家有所啟發(fā)和幫助。

關鍵字: APP 嵌入式 C語言

萬物智聯(lián)時代,嵌入式技術及其應用的形態(tài)將更加豐富和多元,同時也將日益呈現(xiàn)深度物理融合、混合架構共存、群體智能協(xié)同、網絡安全攸關等諸多新的計算特性。顯然,經典的嵌入式系統(tǒng)體系結構、軟硬件技術和開發(fā)方法都已很難應對新趨勢下的...

關鍵字: 嵌入式 物聯(lián)網 計算機

物聯(lián)網是新一代信息技術的重要組成部分,是互聯(lián)網與嵌入式系統(tǒng)發(fā)展到高級階段的融合。通用計算機經歷了從智慧平臺到互聯(lián)網的獨立發(fā)展道路;嵌入式系統(tǒng)則經歷了智慧物聯(lián)到局域智慧物聯(lián)的獨立發(fā)展道路。

關鍵字: 嵌入式 物聯(lián)網 計算機

今天,小編將在這篇文章中為大家?guī)砉た刂靼宓挠嘘P報道,通過閱讀這篇文章,大家可以對工控主板具備清晰的認識,主要內容如下。

關鍵字: 工控主板 嵌入式 主板

隨著工業(yè)4.0、醫(yī)療電子、智能家居、物流管理和電力控制等快速的發(fā)展和推進,嵌入式系統(tǒng)利用自身的技術特點,逐漸成為眾多行業(yè)的標配產品。嵌入式系統(tǒng)具有可控制、可編程、成本低等,它在未來的工業(yè)和生活中有著廣闊的應用前景。在現(xiàn)在...

關鍵字: 嵌入式 物聯(lián)網 人工智能

長久來看,嵌入式只會越來越火,隨著人工智能時代的發(fā)展,嵌入式必定又將迎來一次浪潮和技術的巨大變革。人工智能越是想要表達智能水平,就越要依靠嵌入式技術,嵌入式技術將朝著自動化控制和人機交互發(fā)展。嵌入式因其體積小、可靠性高、...

關鍵字: 嵌入式 物聯(lián)網 人工智能

嵌入式軟件技術到目前為止己經在很多領域起到了中流砥柱的作用,例如在電子消費、移動通訊方面,這種技術為我國的很多行業(yè)提供了更多的可能性。未來,嵌入式軟件技術會為人類做出更大的貢獻。伴隨著計算機技術與電子技術的成熟發(fā)展,電子...

關鍵字: 嵌入式 軟件 人工智能

esim卡的全名為Embedded-SIM,意思就是嵌入式的SIM卡。esim卡的原理簡單來說,就是將手機傳統(tǒng)插入到手機里的SIM卡直接嵌入進設備芯片中,這樣大家就不必再手動物理插入SIM卡,減少了麻煩的同時也降低了si...

關鍵字: 嵌入式 esim卡 手機

嵌入式軟件

15715 篇文章

關注

發(fā)布文章

編輯精選

技術子站

關閉