tcpmp播放器介紹_第1頁
tcpmp播放器介紹_第2頁
tcpmp播放器介紹_第3頁
tcpmp播放器介紹_第4頁
tcpmp播放器介紹_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、TCPMP(The Core Pocket Media Player),這是一個應(yīng)用于智能設(shè)備上的開源媒體播放軟件。TCPMP是一個功能強大開放式的開源多媒體播放器,播放器主要由核心框架模塊(common工程)和解碼器分離器插件組成。TCPMP的插件非常多,聯(lián)合幾個最常用的插件(ffmpeg、splitter)來說明,其中interface 插件實現(xiàn)TCPMP的界面,由于他和媒體播放沒有什么關(guān)系,這部分可以完全被替換掉,替 換成自己的界面。ffmpeg工程是系統(tǒng)主要的音視頻解碼模塊,ffmpeg是一個集錄制、轉(zhuǎn)換、音/視頻編碼 解碼功能為一體的完整的開源解決方案。FFmpeg的開發(fā)是基于Lin

2、ux操作系統(tǒng),但是可以 在大多數(shù)操作系統(tǒng)中編譯和使用。ffmpeg支持MPEG、DivX、MPEG4、AC3、DV、FLV等 40多種編碼,AVI、MPEG、OGG、Matroska、ASF等90多種解碼。很多開源播放器都用 到了 ffmpeg。但是ffmpeg程序解碼效率不是很高,系統(tǒng)僅僅使用了 FFmpeg的部分解碼功 能。ffmpeg 主目錄下主要有 libavcodec、libavformat 和 libavutil 等子目錄。其中 libavcodec 用于存放各個encode/decode模塊,libavformat用于存放muxer/demuxer模塊,libavutil用于 存

3、放內(nèi)存操作等常用模塊。本系統(tǒng)的媒體文件分離器有單獨的splitter模塊完成所以不需要 libavformat 子目錄。ffmpeg 目錄下 libavcodec、libavutil 保留子目錄。libmad工程用于MP3文件解碼,該工程包含兩個功能模塊,一個負(fù)責(zé)解析MP3文件格 式,包括MPEG1音頻文件(MP1,MP2,MP3,MPA),讀取每一幀音頻數(shù)據(jù);另一個負(fù)責(zé)解碼 MPEG1音頻數(shù)據(jù),解碼代碼在libmad子目錄中。libmad是一個開源的高精度MPEG1音頻解碼庫,支持MPEG-1(Layer I, Layer II和 LayerIII,也就是 MP3)。libmad提供 24-

4、bit 的 PCM 輸出,完全是定點 計算,非常適合沒有浮點支持的平臺上使用。使用libmad提供的一系列API,就可以非常 簡單地實現(xiàn)MP3數(shù)據(jù)解碼工作。在libmad的源代碼文件目錄下的mad.h文件中,可以看到 絕大部分該庫的數(shù)據(jù)結(jié)構(gòu)和API等。libmad是用的fixed-integer,通過整數(shù)模擬小數(shù)計算的, 精度只能保證到小數(shù)點后第9位(大于0的最小值0.00000000372529),雖然解碼精度會有 損失,但是極大提高了解碼效率,特別是在嵌入式設(shè)備上也可以實現(xiàn)高碼率MP3文件的解 碼。splitter工程用于解析多種音視頻文件格式??梢越馕龅奈募袷桨ǎ篈SF媒體文件, 視

5、頻文件(AVI,DIVX),Windows 波形文件(WAV,RMP),MPEG 電影文件(MPEG,MPG,MPV), MPEG4文件(MP4,3GP,M4A,M4B,K3G)。以上格式可以被解析但是數(shù)據(jù)編碼不一定能正確 解碼,需要依賴系統(tǒng)的解碼器。common工程是核心模塊,是一個開放的集數(shù)據(jù)輸入、轉(zhuǎn)換、音視頻解碼、信號輸出等 功能為一體的完整的多媒體播放框架。這個框架自身不包含任何的Decode和Split功能,這 些功能由插件實現(xiàn),核心模塊以一個樹狀結(jié)構(gòu)管理所有的功能模塊和插件模塊,實現(xiàn)數(shù)據(jù) Render功能,對輸入、轉(zhuǎn)換、輸出流程的控制,接受播放過程中的操作和對事件進行處理, 同時也

6、實現(xiàn)系統(tǒng)運行中經(jīng)常使用的一些共用函數(shù),比如解碼過程中經(jīng)常使用的逆離散余弦變 換,內(nèi)存操作,界面中需要使用的多語言字符處理等.common工程的主目錄下主要有:blit、 dyncode、overlay pcm、softidct、Win32、zlib 等子目錄。其中 blit 和 overlay 存放是視頻信 號渲染模塊,pcm存放PCM音頻信號轉(zhuǎn)換模塊,softidct存放逆離散余弦變換函數(shù),Win32 存放內(nèi)存操作等常用模塊,dyncode這個目錄的代碼比較晦澀,存放的是程序運行是動態(tài)生 成代碼模塊,針對不同的CPU指令集,PCM數(shù)據(jù)數(shù)據(jù)聲道和采樣率不同,視頻渲染數(shù)據(jù)格 式和色深等不同情況動

7、態(tài)生成不同的優(yōu)化代碼(這段代碼非常精彩,不能不讓人佩服TCPMP 作者的高超水平)。核心模塊有一個上下文對象context,該對象在初始化函數(shù) bool_t Context_Init(中)候創(chuàng)建了一個該對象實例。該對象實例記錄管理各個功能模塊,用戶界面可以通過該對象和核心模塊交互,管理控制播放過程。Context對象說明:typedef struct contextint Version; /版本信息uint32_t ProgramId;const tchar_t* ProgramName; /應(yīng)用程序名稱const tchar_t* ProgramVersion; /程序版本號,字符串con

8、st tchar_t* CmdLine; /程序命令行信息void* Wnd; /視頻渲染窗口句柄void* NodeLock; /功能模塊訪問臨界區(qū)互斥變量array Node; /功能模塊數(shù)據(jù)對象數(shù)組array NodeClass; /功能模塊定義對象數(shù)組,按照系統(tǒng)邏輯關(guān)系組織array NodeClassPri; /功能模塊定義對象數(shù)組,按照系統(tǒng)邏輯關(guān)系和模塊優(yōu)先級排列array NodeModule; /夕卜部插件模塊數(shù)組int LoadModuleNo; 當(dāng)前正在裝載的外部插件序號void* LoadModule;array StrTable2; /字符串資源數(shù)組,字符串分為給底層使

9、用的標(biāo)準(zhǔn)字符串資源和給界面使用的顯示字符串資源,兩種資源用兩個數(shù)組表示array StrBuffer;array StrModule; /未使用void* StrLock; /字符串?dāng)?shù)組訪問臨界區(qū)互斥變量uint32_t Lang; 當(dāng)前使用語言標(biāo)志int CodePage; 當(dāng)前使用代碼頁標(biāo)志struct pcm_soft* PCM; /PCM音頻信號轉(zhuǎn)換模塊struct blitpack* Blit; 視頻信號渲染模塊struct node* Platform; /得到平臺相關(guān)信息struct node* Advanced; /得到播放模塊高級信息struct node* Player;

10、/播放控制模塊notify Error; /信息錯誤回調(diào)函數(shù)/屏幕旋轉(zhuǎn)信息,在某些系統(tǒng)中屏幕可以旋轉(zhuǎn)90度或180度int (*HwOrientation)(void*);void *HwOrientationContext;bool_t TryDynamic; /未使用int SettingsPage; /未使用size_t StartUpMemory; /可以使用的有效內(nèi)存數(shù)bool_t InHibernate; /是否進入休眠狀態(tài)bool_t WaitDisable; /未使用int FtrId; /未使用bool_t LowMemory; /可以使用的有效內(nèi)存數(shù)是否小于系統(tǒng)要求的最低要

11、求動態(tài)代碼生成中間狀態(tài)及數(shù)據(jù)bool_t CodeFailed;bool_t CodeMoveBack;bool_t CodeDelaySlot;void* CodeLock;void* CodelnstBegin;void* CodeInstEnd;int NextCond;bool_t NextSet;bool_t NextByte;bool_t NextHalf;bool_t NextSign;uint32_t* FlushCache; /未使用void* CharConvertUTF8; /未使用void* CharConvertCustom; /未使用int CustomCodePa

12、ge; /未使用void* CharConvertAscii; /未使用void* Application;void* Logger; /未使用bool_t KeepDisplay; /是否保持背光長亮int DisableOutOfMemory; /未使用 context;核心模塊上下文指針可以通過全局函數(shù)獲得context* Context();初始化上下文對象的全局函數(shù)是 bool_t Context_Init(const tchar_t* Name, const tchar_t* ersion, int Id,const tchar_t* CmdLine, void* Applicat

13、ion);其中 Name 參數(shù)為應(yīng)用程序名稱, Version為版本信息字符串。釋放上下文對象的全局函數(shù)是void Context_Done();。void Context_Wnd(void*);函數(shù)將視頻播放窗口句柄初始化給設(shè)備上下文。功能模塊包含定義對象和數(shù)據(jù)對象,定義對象描述功能模塊相互間的邏輯結(jié)構(gòu),數(shù)據(jù)對 象記錄模塊屬性和方法。所有的功能模塊結(jié)構(gòu)按一個樹狀結(jié)構(gòu)來組織,結(jié)構(gòu)關(guān)系如下,NODE是整個結(jié)構(gòu)的根結(jié) 點,其下為子節(jié)點,節(jié)點按類型可分為實節(jié)點,全局節(jié)點,設(shè)置節(jié)點,抽象節(jié)點。#define CF_SIZE 0 x00FFFFFF#define CF_GLOBAL 0 x0100000

14、0#define CF_SETTINGS 0 x02000000#define CF_ABSTRACT 0 x08000000抽象節(jié)點沒有對應(yīng)的對象實例,類似C+的抽象基類,為了按照邏輯關(guān)系組織系統(tǒng)結(jié)構(gòu) 而存在,例如NODE就是抽象節(jié)點。全局節(jié)點全局只有一個對象的實例,如播放控制模塊 PLAYER_I D。設(shè)置節(jié)點表示和系統(tǒng)播放設(shè)置相關(guān),比如聲音均衡器模塊EQUALIZER_ID, 顏色控制模塊COLOR_ID。實節(jié)點與抽象節(jié)點不同,指可以生成對象實例的節(jié)點,實節(jié)點 沒有特殊標(biāo)識,一般以數(shù)據(jù)對象占用內(nèi)存大小表示是否是一個實節(jié)點,創(chuàng)建節(jié)點時要根據(jù)該 信息分配內(nèi)存單元,實節(jié)點也可以有子節(jié)點,例如:

15、MMS_ID的父節(jié)點是HTTP_ID。全局 節(jié)點,設(shè)置節(jié)點和實節(jié)點可以相互組合,比如播放控制節(jié)點同時是全局節(jié)點,設(shè)置節(jié)點和實 節(jié)點。節(jié)點名稱后帶ID的就是實節(jié)點,否則就是抽象節(jié)點。NODE (根節(jié)點)FLOW (流控制模塊)| CODEC (解碼模塊)| | EQUALIZERJD (聲音均衡器模塊)| | VBUFFERJD (視頻緩沖模塊)| | |_DMO (DirectX Media Object)| | | |WMV_ID| | | |WMS_ID| | | |WMVA_ID| | | |WMA_ID| | | !WMAV_ID| | |FFMPEG VIDEO (FFMpeg 解碼

16、模塊)| | L-LIBMAD_ID (Libmad Mp3 解碼模塊)| OUT (信號渲染模塊)| | AOUT (音頻信號渲染)| | | |NULLAUDIO_ID| | | L-WAVEOUT_ID| | L-VOUT (視頻信號渲染)| |NULLVIDEO_ID| | L-OVERLAY| IDCT (離散余弦解碼模塊)| | L-softidct_id| L-CODECIDCT (離散余弦解碼模塊,函數(shù)比IDCT要少)| L-mpeG1_ID|MEDIA (媒體文件格式編碼解析模塊)| FORMAT (格式解析模塊)| | L-FORMATBASE| | |-RAWAUDIO|

17、 L-mP3_ID|-RAWIMAGE|-asf_id|AVI_ID|MP4_ID|MPG_ID|NSV_ID|L-wav_id| PLAYLIST (播放列表模塊)| | |-asx_id| | |M3U_ID| | L-pls_ID| L-STREAMPROCESS (數(shù)據(jù)流處理模塊)STREAM (數(shù)據(jù)輸入模塊)| MEMSTREAM_ID (內(nèi)存數(shù)據(jù)流模塊)| |FILE_ID (文件 IO 模塊)| L-HTTP_ID (網(wǎng)絡(luò)數(shù)據(jù)獲取模塊)TIMER (定時器模塊)I l-SYSTIMER_IDASSOCIATION_ID (文件擴展名自動關(guān)聯(lián)模塊)ADVANCED_ID (高級設(shè)置

18、模塊)COLOR_ID (顏色控制模塊)platform_id (平臺信息模塊)|XSCALEDRIVER_ID (Intel XScale CPU 信息模塊)player_id (播放控制模塊)L-PLAYER_BUFFER_ID (播放緩沖模塊)節(jié)點樹狀結(jié)構(gòu)由若干個靜態(tài)定義對象(nodedef)實例實現(xiàn),typedef struct nodedefint Flags;int Class;int ParentClass;int Priority;nodecreate Create;nodedelete Delete; nodedef;Flags表示當(dāng)前節(jié)點的類型:抽象、實節(jié)點、全局、設(shè)置。C

19、lass表示當(dāng)前節(jié)點的標(biāo)識,如MEDIA_CLASS或ASF_ID等等。ParentClass表示當(dāng)前節(jié)點的父節(jié)點標(biāo)識,如SYSTIMER_ID對象的父節(jié)點是 TIMER_CLASS。Priority表示當(dāng)前節(jié)點優(yōu)先級。Create和Delete是兩個函數(shù)指針,表示該節(jié)點的創(chuàng)建函數(shù)和銷毀函數(shù)。如播放控制模塊的結(jié)構(gòu)定義是static const nodedef Player =sizeof(player_base)|CF_GLOBAL|CF_SETTINGS,PLAYER_ID,NODE_CLASS,PRI_MAXIMUM+600,(nodecreate)Create,(nodedelete)D

20、elete,;絕大多數(shù)節(jié)點都有一個對應(yīng)的數(shù)據(jù)對象,記錄該節(jié)點的數(shù)據(jù)和方法,每一個子節(jié)點對 象都是以父節(jié)點對象作為該節(jié)點一個元素,類似C+的封裝繼承機制。如果子節(jié)點的父節(jié)點 沒有數(shù)據(jù)對象,該節(jié)點可以從node節(jié)點直接繼承。每一個節(jié)點都可以看成Node節(jié)點的直 接或間接子節(jié)點,所以所有節(jié)點頭以一個相同的node結(jié)構(gòu)開頭,子節(jié)點可能還有自己的屬 性,在繼承父對象后就是子節(jié)點自己的元素。typedef struct nodeint Class;nodeenum Enum;nodeget Get;nodeset Set; node;Class表示該對象的標(biāo)識,如PLAYER_ID。Enum是一個函數(shù)指針

21、,指向一個函數(shù)用于枚舉當(dāng)前節(jié)點的屬性。Get是一個函數(shù)指針,得到當(dāng)前節(jié)點某一屬性值。Set是一個函數(shù)指針,設(shè)置當(dāng)前節(jié)點的某一屬性數(shù)值。節(jié)點的屬性值數(shù)據(jù)特性在一個static const datatable xxxParams = ;的靜態(tài)數(shù)組里定義。typedef struct datatableint No;int Type;int Flags;int Format1;int Format2; datatable;No表示屬性的標(biāo)識,如播放控制模塊的#define PLAYER_PLAY 0 x32就表示控制播放 器播放或暫停。Type表示屬性的數(shù)據(jù)類型,可用值在node.h中定義。Flag

22、s是屬性數(shù)據(jù)的標(biāo)志,表示該數(shù)據(jù)是不是只讀數(shù)據(jù),是否有最大最小值等等,可用 值在node.h中定義,如果該標(biāo)志包含DF_SETUP同時不包含DF_NOSAVE和DF_RDONLY 屬性,該屬性會被記錄在注冊表中,下次啟動時用注冊表的數(shù)據(jù)初始化該屬性。Format1和Format2是可選標(biāo)志與Flags配合使用,比如如果Flags表示該屬性存在最 大最小值,F(xiàn)ormat 1和Format2可以分別表示最小和最大數(shù)值。在在系統(tǒng)上下文對象中有兩個元素記錄節(jié)點信息array Node;和array NodeClass;, array 是數(shù)組數(shù)據(jù)類型,Node是節(jié)點數(shù)據(jù)對象的數(shù)組,NodeClass節(jié)點對

23、象的數(shù)組,按照系統(tǒng)邏輯 關(guān)系組織。創(chuàng)建節(jié)點時傳入nodedef對象到節(jié)點創(chuàng)建函數(shù),函數(shù)會根據(jù)nodedef信息生成對應(yīng) nodeclass對象添加到NodeClass數(shù)組,同時根據(jù)nodedef信息分配數(shù)據(jù)對象的內(nèi)存空間。在 該節(jié)點的Create函數(shù)里面再初始化該節(jié)點的數(shù)據(jù)對象。在所有功能模塊中和界面加交互的主要就是播放控制模塊struct node* Player;使用方法 如下:context* p = Context();player* myplayer = NULL;if(p) myplayer = (player*)(p-Player);控制播放參數(shù)使用 Set(void* This

24、,int No,const void* Data,int Size);函數(shù),第一個參數(shù)是播 放模塊指針,第二個參數(shù)是控制代碼,即要進行什么操作,第三個參數(shù)是需要賦值給控制代 碼的數(shù)值,最后一個參數(shù)是所賦數(shù)值的占用內(nèi)存的大小。例如開始播放的代碼是:myplayer-Set(myplayer,PLAYER_PLAY1,sizeof(int);PLAYER_PLAY為控制代碼,表示當(dāng)前控制的是播放暫停功能,數(shù)值為1表示播放為0 表示暫停。得到某一控制屬性使用Get(void* This,int No,void* Data,int Size);函數(shù),參數(shù)含義和Set 函數(shù)相同??刂拼a是一組宏,定義在

25、player.h文件中。比較重要的控制參數(shù)有/ play or pause (bool_t)#define PLAYER_PLAY 0 x32/ position in fraction (fraction)#define PLAYER_PERCENT 0 x25/ position in time (tick_t)#define PLAYER_POSITION 0 x28/ current format (format*)#define PLAYER_FORMAT 0 x2B/ current file in playlist (int)#define PLAYER_LIST_CURRENT 0 x2F/ current file index (suffled) in playlist (int)#define PLAYER_LIST_CURRIDX 0 xA2/ fullscreen mode (bool_t)#define PLAYER_

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論