a一级爱做片免费观看欧美,久久国产一区二区,日本一二三区免费,久草视频手机在线观看

新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > 基于Qt的嵌入式媒體播放器系統的設計

基于Qt的嵌入式媒體播放器系統的設計

作者: 時間:2009-04-22 來源:網絡 收藏

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

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

3)讀取音頻采樣函數

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

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

4)讀取視頻幀函數

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

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

5)函數定義:int Sync(File*fp,int auIndex,struct timeval*vtime);

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

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

3.2解碼庫模塊

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

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

3 實現

3.1 數據流程總體

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

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

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

linux操作系統文章專題:linux操作系統詳解(linux不再難懂)


評論


相關推薦

技術專區

關閉