Android的多媒體框架OpenCore介紹_第1頁(yè)
Android的多媒體框架OpenCore介紹_第2頁(yè)
Android的多媒體框架OpenCore介紹_第3頁(yè)
Android的多媒體框架OpenCore介紹_第4頁(yè)
Android的多媒體框架OpenCore介紹_第5頁(yè)
已閱讀5頁(yè),還剩21頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第一部分 OpenCore概述OpenCore的另外一個(gè)常用的稱(chēng)呼是PacketVideo,它是Android的多媒體核心。在防站的過(guò)程中,PacketVideo是一家公司的名稱(chēng),而OpenCore是這套多媒體框架的軟件層的名稱(chēng)。在Android的開(kāi)發(fā)者中間,二者的含義基本相同。對(duì)比Android的其它程序庫(kù),OpenCore的代碼非常龐大,它是一個(gè)基于C+的實(shí)現(xiàn),定義了全功能的操作系統(tǒng)移植層,各種基本的功能均被封裝成類(lèi)的形式,各層次之間的接口多使用繼承等方式。OpenCore是一個(gè)多媒體的框架,從宏觀上來(lái)看,它主要包含了兩大方面的內(nèi)容:PVPlayer:提供媒體播放器的功能,完成各種音頻(A

2、udio)、視頻(Video)流的回放(Playback)功能PVAuthor:提供媒體流記錄的功能,完成各種音頻(Audio)、視頻(Video)流的以及靜態(tài)圖像捕獲功能PVPlayer和PVAuthor以SDK的形式提供給開(kāi)發(fā)者,可以在這個(gè)SDK之上構(gòu)建多種應(yīng)用程序和服務(wù)。在移動(dòng)終端中常常使用的多媒體應(yīng)用程序,例如媒體播放器、照相機(jī)、錄像機(jī)、錄音機(jī)等等。為了更好的組織整體的架構(gòu),OpenCore在軟件層次在宏觀上分成幾個(gè)層次:OSCL:Operating System Compatibility Library (操作系統(tǒng)兼容庫(kù)),包含了一些操作系統(tǒng)底層的操作,為了更好地在不同操作系統(tǒng)移植

3、。包含了基本數(shù)據(jù)類(lèi)型、配置、字符串工具、IO、錯(cuò)誤處理、線程等內(nèi)容,類(lèi)似一個(gè)基礎(chǔ)的C+庫(kù)。PVMF:PacketVideo Multimedia Framework(PV多媒體框架),在框架內(nèi)實(shí)現(xiàn)一個(gè)文件解析(parser)和組成(composer)、編解碼的NODE,也可以繼承其通用的接口,在用戶(hù)層實(shí)現(xiàn)一些NODE。PVPlayer Engine:PVPlayer引擎。PVAuthor Engine:PVAuthor引擎。事實(shí)上,OpenCore中包含的內(nèi)容非常多:從播放的角度,PVPlayer的輸入的(Source)是文件或者網(wǎng)絡(luò)媒體流,輸出(Sink)是音頻視頻的輸出設(shè)備,其基本功能包含

4、了媒體流控制、文件解析、音頻視頻流的解碼(Decode)等方面的內(nèi)容。除了從文件中播放媒體文件之外,還包含了與網(wǎng)絡(luò)相關(guān)的RTSP流(Real Time Stream Protocol,實(shí)時(shí)流協(xié)議)。在媒體流記錄的方面,PVAuthor的輸入的(Source)是照相機(jī)、麥克風(fēng)等設(shè)備,輸出(Sink)是各種文件,包含了流的同步、音頻視頻流的編碼(Encode)以及文件的寫(xiě)入等功能。在使用OpenCore的SDK的時(shí)候,有可能需要在應(yīng)用程序?qū)訉?shí)現(xiàn)一個(gè)適配器(Adaptor),然后在適配器之上實(shí)現(xiàn)具體的功能,對(duì)于PVMF的NODE也可以基于通用的接口,在上層實(shí)現(xiàn),以插件的形式使用。第二部分 OpenC

5、ore的代碼結(jié)構(gòu)2.1 代碼結(jié)構(gòu) 以開(kāi)源Android的代碼為例,OpenCore的代碼在以下目錄中:external/opencore/。這個(gè)目錄是OpenCore的根 目錄,其中包含的子目錄如下所示:android:這里面是一個(gè)上層的庫(kù),它基于PVPlayer和PVAuthor的SDK實(shí)現(xiàn)了一個(gè)為Android使用的Player和Author。baselibs:包含數(shù)據(jù)結(jié)構(gòu)和線程安全等內(nèi)容的底層庫(kù)codecs_v2:這是一個(gè)內(nèi)容較多的庫(kù),主要包含編解碼的實(shí)現(xiàn),以及一個(gè)OpenMAX的實(shí)現(xiàn)engines:包含PVPlayer和PVAuthor引擎的實(shí)現(xiàn)extern_libs_v2:包含了kh

6、ronos的OpenMAX的頭文件fileformats:文件格式的解析(parser)工具nodes:提供一些PVMF的NODE,主要是編解碼和文件解析方面的。oscl:操作系統(tǒng)兼容庫(kù)pvmi: 輸入輸出控制的抽象接口protocols:主要是與網(wǎng)絡(luò)相關(guān)的RTSP、RTP、HTTP等協(xié)議的相關(guān)內(nèi)容pvcommon:pvcommon庫(kù)文件的Android.mk文件,沒(méi)有源文件。pvplayer:pvplayer庫(kù)文件的Android.mk文件,沒(méi)有源文件。pvauthor:pvauthor庫(kù)文件的Android.mk文件,沒(méi)有源文件。tools_v2:編譯工具以及一些可注冊(cè)的模塊。 在exte

7、rnal/opencore/目錄中還有2個(gè)文件,如下所示:Android.mk:全局的編譯文件pvplayer.conf:配置文件 在external/opencore/的各個(gè)子文件夾中包含了眾多的Android.mk文件,它們之間還存在著“遞歸”的關(guān)系。例如根目錄下的Android.mk,就包含了如下的內(nèi)容片斷:復(fù)制代碼1. include $(PV_TOP)/pvcommon/Android.mk2. include $(PV_TOP)/pvplayer/Android.mk3. include $(PV_TOP)/pvauthor/Android.mk這表示了要引用pvcommon,pv

8、player和pvauthor等文件夾下面的Android.mk文件。external/opencore/的各個(gè)Android.mk文件可以按照排列組合進(jìn)行使用,將幾個(gè)Android.mk內(nèi)容合并在一個(gè)庫(kù)當(dāng)中2.2 編譯結(jié)構(gòu) 1庫(kù)的層次關(guān)系:在Android的開(kāi)源版本中編譯出來(lái)的內(nèi)容,OpenCore編譯出來(lái)的各個(gè)庫(kù)如下所示:libopencoreauthor.so:OpenCore的Author庫(kù)libopencorecommon.so:OpenCore底層的公共庫(kù)libopencoredownloadreg.so :下載注冊(cè)庫(kù)libopencoredownload.so:下載功能實(shí)現(xiàn)庫(kù)li

9、bopencoremp4reg.so :MP4注冊(cè)庫(kù)libopencoremp4.so:MP4功能實(shí)現(xiàn)庫(kù)libopencorenet_support.so:網(wǎng)絡(luò)支持庫(kù)libopencoreplayer.so :OpenCore的Player庫(kù)libopencorertspreg.so:RTSP注冊(cè)庫(kù)libopencorertsp.so :RTSP功能實(shí)現(xiàn)庫(kù) 這些庫(kù)的層次關(guān)系如下圖所示:OpenCore的各個(gè)庫(kù)之間具有如下的關(guān)系:libopencorecommon.so是所有的庫(kù)的依賴(lài)庫(kù),提供了公共的功能;libopencoreplayer.so和libopencoreauthor.so是兩個(gè)并

10、立的庫(kù),分別用于回放和記錄,而且這兩個(gè)庫(kù)是OpenCore對(duì)外的接口庫(kù);libopencorenet_support.so提供網(wǎng)絡(luò)支持的功能;一些功能以插件(Plug-In)的方式放入Player中使用,每個(gè)功能使用兩個(gè)庫(kù),一個(gè)實(shí)現(xiàn)具體功能,一個(gè)用于注冊(cè)。2libopencorecommon.so庫(kù)的結(jié)構(gòu)libopencorecommon.so是整個(gè)OpenCore的核心庫(kù),它的編譯控制的文件的路徑為pvcommon/Android.mk,這個(gè)文件使用遞歸的方式尋找子文件:復(fù)制代碼1. include $(BUILD_SHARED_LIBRARY)2. include $(PV_TOP)/os

11、cl/oscl/osclbase/Android.mk3. include $(PV_TOP)/oscl/oscl/osclerror/Android.mk4. include $(PV_TOP)/oscl/oscl/osclmemory/Android.mk5. include $(PV_TOP)/oscl/oscl/osclutil/Android.mk6. include $(PV_TOP)/oscl/pvlogger/Android.mk7. include $(PV_TOP)/oscl/oscl/osclproc/Android.mk8. include $(PV_TOP)/oscl

12、/oscl/osclio/Android.mk9. include $(PV_TOP)/oscl/oscl/osclregcli/Android.mk10. include $(PV_TOP)/oscl/oscl/osclregserv/Android.mk11. include $(PV_TOP)/oscl/unit_test/Android.mk12. include $(PV_TOP)/oscl/oscl/oscllib/Android.mk13. include $(PV_TOP)/pvmi/pvmf/Android.mk14. include $(PV_TOP)/baselibs/p

13、v_mime_utils/Android.mk15. include $(PV_TOP)/nodes/pvfileoutputnode/Android.mk16. include $(PV_TOP)/baselibs/media_data_structures/Android.mk17. include $(PV_TOP)/baselibs/threadsafe_callback_ao/Android.mk18. include $(PV_TOP)/codecs_v2/utilities/colorconvert/Android.mk19. include $(PV_TOP)/codecs_v

14、2/audio/gsm_amr/amr_nb/common/Android.mk20. include $(PV_TOP)/codecs_v2/video/avc_h264/common/Android.mk這些被包含的Android.mk文件真正指定需要編譯的文件,這些文件在Android.mk的目錄及其子目錄中。事實(shí)上,在libopencorecommon.so庫(kù)中包含了以下內(nèi)容:OSCL的所有內(nèi)容Pvmf框架部分的內(nèi)容(pvmi/pvmf/Android.mk)基礎(chǔ)庫(kù)中的一些內(nèi)容(baselibs)編解碼的一些內(nèi)容文件輸出的node(nodes/pvfileoutputnode/Andr

15、oid.mk)從庫(kù)的結(jié)構(gòu)中可以看出,最終生成庫(kù)的結(jié)構(gòu)與OpenCore的層次關(guān)系并非完全重合。libopencorecommon.so庫(kù)中就包含了底層的OSCL的內(nèi)容、PVMF的框架以及Node和編解碼的工具。3libopencoreplayer.so庫(kù)的結(jié)構(gòu)libopencoreplayer.so是用于播放的功能庫(kù),它的編譯控制的文件的路徑為pvplayer/Android.mk,它包含了以下的內(nèi)容:復(fù)制代碼1. include $(BUILD_SHARED_LIBRARY)2. include $(PV_TOP)/engines/player/Android.mk3. include $(

16、PV_TOP)/codecs_v2/audio/aac/dec/util/getactualaacconfig/Android.mk4. include $(PV_TOP)/codecs_v2/video/avc_h264/dec/Android.mk5. include $(PV_TOP)/codecs_v2/audio/aac/dec/Android.mk6. include $(PV_TOP)/codecs_v2/audio/gsm_amr/amr_nb/dec/Android.mk7. include $(PV_TOP)/codecs_v2/audio/gsm_amr/amr_wb/d

17、ec/Android.mk8. include $(PV_TOP)/codecs_v2/audio/gsm_amr/common/dec/Android.mk9. include $(PV_TOP)/codecs_v2/audio/mp3/dec/Android.mk10. include $(PV_TOP)/codecs_v2/utilities/m4v_config_parser/Android.mk11. include $(PV_TOP)/codecs_v2/utilities/pv_video_config_parser/Android.mk12. include $(PV_TOP)

18、/codecs_v2/omx/omx_common/Android.mk13. include $(PV_TOP)/codecs_v2/omx/omx_queue/Android.mk14. include $(PV_TOP)/codecs_v2/omx/omx_h264/Android.mk15. include $(PV_TOP)/codecs_v2/omx/omx_aac/Android.mk16. include $(PV_TOP)/codecs_v2/omx/omx_amr/Android.mk17. include $(PV_TOP)/codecs_v2/omx/omx_mp3/A

19、ndroid.mk18. include $(PV_TOP)/codecs_v2/omx/factories/omx_m4v_factory/Android.mk19. include $(PV_TOP)/codecs_v2/omx/omx_proxy/Android.mk20. include $(PV_TOP)/nodes/common/Android.mk21. include $(PV_TOP)/pvmi/content_policy_manager/Android.mk22. include $(PV_TOP)/pvmi/content_policy_manager/plugins/

20、oma1/passthru/Android.mk23. include $(PV_TOP)/pvmi/content_policy_manager/plugins/common/Android.mk24. include $(PV_TOP)/pvmi/media_io/pvmiofileoutput/Android.mk25. include $(PV_TOP)/fileformats/common/parser/Android.mk26. include $(PV_TOP)/fileformats/id3parcom/Android.mk27. include $(PV_TOP)/filef

21、ormats/rawgsmamr/parser/Android.mk28. include $(PV_TOP)/fileformats/mp3/parser/Android.mk29. include $(PV_TOP)/fileformats/mp4/parser/Android.mk30. include $(PV_TOP)/fileformats/rawaac/parser/Android.mk31. include $(PV_TOP)/fileformats/wav/parser/Android.mk32. include $(PV_TOP)/nodes/pvaacffparserno

22、de/Android.mk33. include $(PV_TOP)/nodes/pvmp3ffparsernode/Android.mk34. include $(PV_TOP)/nodes/pvamrffparsernode/Android.mk35. include $(PV_TOP)/nodes/pvmediaoutputnode/Android.mk36. include $(PV_TOP)/nodes/pvomxvideodecnode/Android.mk37. include $(PV_TOP)/nodes/pvomxaudiodecnode/Android.mk38. inc

23、lude $(PV_TOP)/nodes/pvwavffparsernode/Android.mk39. include $(PV_TOP)/pvmi/recognizer/Android.mk40. include $(PV_TOP)/pvmi/recognizer/plugins/pvamrffrecognizer/Android.mk41. include $(PV_TOP)/pvmi/recognizer/plugins/pvmp3ffrecognizer/Android.mk42. include $(PV_TOP)/pvmi/recognizer/plugins/pvwavffre

24、cognizer/Android.mk43. include $(PV_TOP)/engines/common/Android.mk44. include $(PV_TOP)/engines/adapters/player/framemetadatautility/Android.mk45. include $(PV_TOP)/protocols/rtp_payload_parser/util/Android.mk46. include $(PV_TOP)/android/Android.mk47. include $(PV_TOP)/android/drm/oma1/Android.mk48

25、. include $(PV_TOP)/tools_v2/build/modules/linux_rtsp/core/Android.mk49. include $(PV_TOP)/tools_v2/build/modules/linux_rtsp/node_registry/Android.mk50. include $(PV_TOP)/tools_v2/build/modules/linux_net_support/core/Android.mk51. include $(PV_TOP)/tools_v2/build/modules/linux_download/core/Android.

26、mk52. include $(PV_TOP)/tools_v2/build/modules/linux_download/node_registry/Android.mk53. include $(PV_TOP)/tools_v2/build/modules/linux_mp4/core/Android.mk54. include $(PV_TOP)/tools_v2/build/modules/linux_mp4/node_registry/Android.mklibopencoreplayer.so中包含了以下內(nèi)容:一些解碼工具文件的解析器(mp4)解碼工具對(duì)應(yīng)的Nodeplayer的引

27、擎部分(engines/player/Android.mk)為Android的player適配器(android/Android.mk)識(shí)別工具(pvmi/recognizer)編解碼工具中的OpenMax部分(codecs_v2/omx)對(duì)應(yīng)幾個(gè)插件Node的注冊(cè)libopencoreplayer.so中的內(nèi)容較多,其中主要為各個(gè)文件解析器和解碼器,PVPlayer的核心功能在engines/player/Android.mk當(dāng)中,而android/Android.mk的內(nèi)容比較特殊,它是在PVPlayer之上構(gòu)建的一個(gè)為Android使用的播放器。4libopencoreauthor.so

28、庫(kù)的結(jié)構(gòu)libopencoreauthor.so是用于媒體流記錄的功能庫(kù),它的編譯控制的文件的路徑為pvauthor/Android.mk,它包含了以下的內(nèi)容:復(fù)制代碼1. include $(BUILD_SHARED_LIBRARY)2. include $(PV_TOP)/engines/author/Android.mk3. include $(PV_TOP)/codecs_v2/video/m4v_h263/enc/Android.mk4. include $(PV_TOP)/codecs_v2/audio/gsm_amr/amr_nb/enc/Android.mk5. include

29、 $(PV_TOP)/codecs_v2/video/avc_h264/enc/Android.mk6. include $(PV_TOP)/fileformats/mp4/composer/Android.mk7. include $(PV_TOP)/nodes/pvamrencnode/Android.mk8. include $(PV_TOP)/nodes/pvmp4ffcomposernode/Android.mk9. include $(PV_TOP)/nodes/pvvideoencnode/Android.mk10. include $(PV_TOP)/nodes/pvavcen

30、cnode/Android.mk11. include $(PV_TOP)/nodes/pvmediainputnode/Android.mk12. include $(PV_TOP)/android/author/Android.mk libopencoreauthor.so中包含了以下內(nèi)容:一些編碼工具(視頻流H263、H264,音頻流Amr)文件的組成器(mp4)編碼工具對(duì)應(yīng)的Node表示媒體輸入的Node(nodes/pvmediainputnode/Android.m)author的引擎部分(engines/author/Android.mk)為Android的author適配器(a

31、ndroid/author/Android.mk)libopencoreauthor.so中主要為各個(gè)文件編碼器和文件組成器,PVAuthor的核心功能在engines/author/Android.mk當(dāng)中,而android/author/Android.mk是在PVAuthor之上構(gòu)建的一個(gè)為Android使用的媒體記錄器。5其他庫(kù)另外的幾個(gè)庫(kù)的Android.mk文件的路徑如下所示:網(wǎng)絡(luò)支持庫(kù)libopencorenet_support.so:tools_v2/build/modules/linux_net_support/core/Android.mkMP4功能實(shí)現(xiàn)庫(kù)libopenco

32、remp4.so和注冊(cè)庫(kù)libopencoremp4reg.so:tools_v2/build/modules/linux_mp4/core/Android.mktools_v2/build/modules/linux_mp4/node_registry/Android.mkRTSP功能實(shí)現(xiàn)庫(kù)libopencorertsp.so和注冊(cè)庫(kù)libopencorertspreg.so:tools_v2/build/modules/linux_rtsp/core/Android.mktools_v2/build/modules/linux_rtsp/node_registry/Android.mk下載

33、功能實(shí)現(xiàn)庫(kù)libopencoredownload.so和注冊(cè)庫(kù)libopencoredownloadreg.so:tools_v2/build/modules/linux_download/core/Android.mktools_v2/build/modules/linux_download/node_registry/Android.mk第三部分 OpenCore OSCL簡(jiǎn)介OSCL,全稱(chēng)為Operating System Compatibility Library (操作系統(tǒng)兼容庫(kù)),它包含了一些在不同操作系統(tǒng)中移植層的功能,其代碼結(jié)構(gòu)如下所示:oscl/oscl|- config:配

34、置的宏|- makefile|- makefile.pv|- osclbase:包含基本類(lèi)型、宏以及一些STL容器類(lèi)似的功能|- osclerror:錯(cuò)誤處理的功能|- osclio:文件IO和Socket等功能|- oscllib:動(dòng)態(tài)庫(kù)接口等功能|- osclmemory :內(nèi)存管理、自動(dòng)指針等功能|- osclproc:線程、多任務(wù)通訊等功能|- osclregcli :注冊(cè)客戶(hù)端的功能|- osclregserv:注冊(cè)服務(wù)器的功能- osclutil :字符串等基本功能在oscl的目錄中,一般每一個(gè)目錄表示一個(gè)模塊。OSCL對(duì)應(yīng)的功能是非常細(xì)致的,幾乎對(duì)C語(yǔ)言中每一個(gè)細(xì)節(jié)的功能都進(jìn)行封

35、裝,并使用了C+的接口提供給上層使用。事實(shí)上,OperCore中的PVMF、Engine部分都在使用OSCL,而整個(gè)OperCore的調(diào)用者也需要使用OSCL。在OSCL的實(shí)現(xiàn)中,很多典型的C語(yǔ)言函數(shù)被進(jìn)行了簡(jiǎn)單的封裝,例如:osclutil中與數(shù)學(xué)相關(guān)的功能在oscl_math.inl中被定義成為了內(nèi)嵌(inline)的函數(shù):復(fù)制代碼1. OSCL_COND_EXPORT_REF OSCL_INLINE double oscl_log(double value)2. 3. return (double) log(value);4. 5. OSCL_COND_EXPORT_REF OSCL_I

36、NLINE double oscl_log10(double value)6. 7. return (double) log10(value);8. 9. OSCL_COND_EXPORT_REF OSCL_INLINE double oscl_sqrt(double value)10. 11. return (double) sqrt(value);12. oscl_math.inl文件又被oscl_math.h所包含,因此其結(jié)果是oscl_log()等功能的使用等價(jià)于原始的log()等函數(shù)。很多C語(yǔ)言標(biāo)準(zhǔn)庫(kù)的句柄都被定義成為了C+類(lèi)的形式,實(shí)現(xiàn)由一些繁瑣,但是復(fù)雜性都不是很高。以oscll

37、ib為例,其代碼結(jié)構(gòu)如下所示:oscl/oscl/oscllib/|- Android.mk|- build| - make| - makefile- src|- oscl_library_common.h|- oscl_library_list.cpp|- oscl_library_list.h|- oscl_shared_lib_interface.h|- oscl_shared_library.cpp- oscl_shared_library.hoscl_shared_library.h是提供給上層使用的動(dòng)態(tài)庫(kù)的接口功能,它定義的接口如下所示:復(fù)制代碼1. class OsclShare

38、dLibrary2. 3. public:4. OSCL_IMPORT_REF OsclSharedLibrary();5. OSCL_IMPORT_REF OsclSharedLibrary(const OSCL_String& aPath);6. OSCL_IMPORT_REF OsclSharedLibrary();7. OSCL_IMPORT_REF OsclLibStatus LoadLib(const OSCL_String& aPath);8. OSCL_IMPORT_REF OsclLibStatus LoadLib();9. OSCL_IMPORT_REF void SetL

39、ibPath(const OSCL_String& aPath);10. OSCL_IMPORT_REF OsclLibStatus QueryInterface(const OsclUuid& aInterfaceId, OsclAny*& aInterfacePtr);11. OSCL_IMPORT_REF OsclLibStatus Close();12. OSCL_IMPORT_REF void AddRef();13. OSCL_IMPORT_REF void RemoveRef();14. 這些接口顯然都是與庫(kù)的加載有關(guān)系的,而在oscl_shared_library.cpp 中其

40、具體的功能是使用dlopen()等函數(shù)來(lái)實(shí)現(xiàn)的。第四部分 文件格式處理和編解碼部分簡(jiǎn)介在多媒體方面,文件格式的處理和編解碼(Codec)是很基礎(chǔ)的兩個(gè)方面的內(nèi)容。多媒體應(yīng)用的兩個(gè)方面是媒體的播放(PlayBack)和媒體的記錄(Recording)。 在媒體的播放過(guò)程中,通常情況是從對(duì)媒體文件的播放,必要的兩個(gè)步驟為文件的解析和媒體流的解碼。例如對(duì)于一個(gè)mp4的文件,其中可能包括AMR和AAC的音頻流,H263、MPEG4以及AVC(H264)的視頻流,這些流被封裝在3GP的包當(dāng)中,媒體播放器要做的就是從文件中將這些流解析出來(lái),然后對(duì)媒體流進(jìn)行解碼,解碼后的數(shù)據(jù)才可以播放。 在媒體的記錄過(guò)程中

41、,通過(guò)涉及到視頻、音頻、圖像的捕獲功能。對(duì)于將視頻加音頻錄制成文件功能,其過(guò)程與播放剛好相反,首先從硬件設(shè)備得到視頻和音頻的媒體流,然后對(duì)其進(jìn)行編碼,編碼號(hào)的流還需要被分層次寫(xiě)入到文件之中,最終得到組成好的文件。OpenCore有關(guān)文件格式處理和編解碼部分兩部分的內(nèi)容,分別在目錄fileformats和codecs_v2當(dāng)中。這兩部分都屬于基礎(chǔ)性的功能,不涉及具體的邏輯,因此它們被別的模塊調(diào)用來(lái)使用,例如:構(gòu)建各種Node。4.1 文件格式的處理 由于同時(shí)涉及播放文件和記錄文件兩種功能,因此OpenCore中的文件格式處理有兩種類(lèi)型,一種是parser(解析器),另一種是composer(組成

42、器)。fileformats的目錄結(jié)構(gòu)如下所示:fileformats|- avi| - parser|- common| - parser|- id3parcom| |- Android.mk| |- build| |- include| - src|- mp3| - parser|- mp4| |- composer| - parser|- rawaac| - parser|- rawgsmamr| - parser- wav- parser 目錄包含各個(gè)子目錄中,它們對(duì)應(yīng)的是不同的文件格式,例如mp3、mp4和wav等。4.2 編解碼 編解碼部分主要針對(duì)Audio和Video,codec

43、s_v2的目錄結(jié)構(gòu)如下所示:codecs_v2|- audio| |- aac| |- gsm_amr| |- mp3| - sbc|- omx| |- factories| |- omx_aac| |- omx_amr| |- omx_common| |- omx_h264| |- omx_m4v| |- omx_mp3| |- omx_proxy| - omx_queue|- utilities| |- colorconvert| |- m4v_config_parser| - pv_video_config_parser- video|- avc_h264- m4v_h263 在audi

44、o 和video目錄中,對(duì)應(yīng)了針對(duì)各種流的子目錄,其中可能包含dec和enc兩個(gè)目錄,分別對(duì)應(yīng)解碼和編碼。video目錄展開(kāi)后的內(nèi)容如下所示:- video|- avc_h264| |- common| |- dec| |- enc| - patent_disclaimer.txt- m4v_h263|- dec|- enc- patent_disclaimer.txt codecs_v2目錄的子目錄omx實(shí)現(xiàn)了一個(gè)khronosOpenMAX的功能。OpenMAX是一個(gè)多媒體應(yīng)用程序的框架標(biāo)準(zhǔn),由NVIDIA公司和Khronos在2006年推出。OpenMAX IL 1.0(集成層)技術(shù)規(guī)格

45、定義了媒體組件接口,以便在嵌入式器件的流媒體框架中快速集成加速式編解碼器。OpenMAX的設(shè)計(jì)實(shí)現(xiàn)可以讓具有硬件編輯碼功能的平臺(tái)提供統(tǒng)一的接口和框架,在OpenMAX中可以直接使用硬件加速的進(jìn)行編解碼乃至輸出的功能,對(duì)外保持統(tǒng)一的接口。但是在此處的OpenMAX則是一個(gè)純軟件的實(shí)現(xiàn)。第五部分 OpenCore Player介紹5.1 Player的組成OpenCore的Player的編譯文件是pvplayer/Android.mk,將生成動(dòng)態(tài)庫(kù)文件libopencoreplayer.so。這個(gè)庫(kù)包含了兩方面的內(nèi)容:一方是Player的engine(引擎),一方面是為Android構(gòu)件的Play

46、er,這實(shí)際上是一個(gè)適配器(adapter)。engine的路徑是engine/player;adapter的路徑是android。5.2 Player Engine部分OpenCore的Player Engine具有清晰明確的接口。在這個(gè)接口之上,不同的系統(tǒng)可一個(gè)根據(jù)自己的情況實(shí)現(xiàn)不同Player。目錄engines中的文件結(jié)構(gòu)如下所示:engines/player/|- Android.mk|- build| |- linux_nj| |- make| - makefile.conf|- config| - linux_nj|- include| |- pv_player_datasink

47、.h| |- pv_player_datasinkfilename.h| |- pv_player_datasinkpvmfnode.h| |- pv_player_datasource.h| |- pv_player_datasourcepvmfnode.h| |- pv_player_datasourceurl.h| |- pv_player_events.h| |- pv_player_factory.h| |- pv_player_interface.h| |- pv_player_license_acquisition_interface.h| |- pv_player_regist

48、ry_interface.h| |- pv_player_track_selection_interface.h| - pv_player_types.h|- sample_app| |- Android.mk| |- build| |- sample_player_app_release.txt| - src|- src| |- pv_player_datapath.cpp| |- pv_player_datapath.h| |- pv_player_engine.cpp| |- pv_player_engine.h| |- pv_player_factory.cpp| |- pv_play

49、er_node_registry.h| - pv_player_sdkinfo.h- test|- Android.mk|- build|- config- src其中,engines/player/include目錄中是接口頭文件,engines/player/src目錄源文件和私有頭文件,主要頭文件的功能如下所示:pv_player_types.h:定義一些數(shù)據(jù)結(jié)構(gòu)和枚舉值pv_player_events.h:定義UUID和一些錯(cuò)誤值。pv_player_datasink.h:datasink是媒體數(shù)據(jù)的輸出,定義類(lèi)PVPlayerDataSink,這是媒體數(shù)據(jù)輸出的基類(lèi),作為接口使用pv

50、_player_datasinkfilename.h:定義類(lèi)PVPlayerDataSinkFilename繼承PVPlayerDataSink。pv_player_datasinkpvmfnode.h:定義類(lèi)PVPlayerDataSinkPVMFNode繼承PVPlayerDataSink。pv_player_datasource.h:datasource是媒體數(shù)據(jù)的輸入,定義類(lèi)PVPlayerDataSource,這是媒體數(shù)據(jù)輸入的基類(lèi),作為接口使用。pv_player_datasourcepvmfnode.h:定義類(lèi)PVPlayerDataSourcePVMFNode繼承PVPlaye

51、rDataSource。pv_player_datasourceurl.h:定義類(lèi)PVPlayerDataSourceURL繼承PVPlayerDataSource。pv_player_interface.h:定義Player的接口PVPlayerInterface,這是一個(gè)接口類(lèi)。pv_player_factory.h:主要定義工廠類(lèi)PVPlayerFactory,用于創(chuàng)建和銷(xiāo)毀PVPlayerInterface。事實(shí)上,在engines/player/src目錄中,主要實(shí)現(xiàn)類(lèi)為pv_player_engine.cpp,其中定義了類(lèi)PVPlayerEngine,PVPlayerEngine繼

52、承了PVPlayerInterface,這是一個(gè)實(shí)現(xiàn)類(lèi),在PVPlayerFactory創(chuàng)建PVPlayerInterface接口的時(shí)候,實(shí)際創(chuàng)建的是PVPlayerEngine。在Player Engine的實(shí)現(xiàn)中,包含了編解碼和流控制等功能,而輸出的介質(zhì)需要從外部設(shè)置近來(lái)。PVPlayerInterface定義的接口基本是按照操作順序的,主要的接口如下所示:復(fù)制代碼1. PVCommandId AddDataSource(PVPlayerDataSource& aDataSource, const OsclAny* aContextData = NULL);PVCommandId Init

53、(const OsclAny* aContextData = NULL);2. PVCommandId AddDataSink(PVPlayerDataSink& aDataSink, const OsclAny* aContextData = NULL);3. PVCommandId Prepare(const OsclAny* aContextData = NULL);4. PVCommandId Start(const OsclAny* aContextData = NULL);5. PVCommandId Pause(const OsclAny* aContextData = NULL);6. PVCommandId Resume(const OsclAny* aContextData = NULL);7. PVCommandId Stop(const OsclAny* aContextData = NULL);8. PVCommandId RemoveDataSink(PVPlayerDataSink& aDataSink, const OsclAny* aContextData = NULL);9. PVCommandId

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論