Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 中級開發 >> Android的多媒體框架OpenCore介紹(2)

Android的多媒體框架OpenCore介紹(2)

編輯:中級開發

android的多媒體框架OpenCore(PacketVideo)介紹


4.libopencoreauthor.so庫的結構
     libopencoreauthor.so是用於媒體流記錄的功能庫,它的編譯控制的文件的路徑為pvauthor/android.mk,它包含了以下的內容:
include $(BUILD_SHARED_LIBRARY)
include $(PV_TOP)//engines/author/android.mk
include $(PV_TOP)//codecs_v2/video/m4v_h263/enc/android.mk
include $(PV_TOP)//codecs_v2/audio/gsm_amr/amr_nb/enc/android.mk
include $(PV_TOP)//codecs_v2/video/avc_h264/enc/android.mk
include $(PV_TOP)//fileformats/mp4/composer/android.mk
include $(PV_TOP)//nodes/pvamrencnode/android.mk
include $(PV_TOP)//nodes/pvmp4ffcomposernode/android.mk
include $(PV_TOP)//nodes/pvvideoencnode/android.mk
include $(PV_TOP)//nodes/pvavcencnode/android.mk
include $(PV_TOP)//nodes/pvmediainputnode/android.mk
include $(PV_TOP)//android/author/android.mk

libopencoreauthor.so中包含了以下內容:

一些編碼工具(視頻流H263、H264,音頻流Amr)

文件的組成器(mp4)

編碼工具對應的Node

表示媒體輸入的Node(nodes/pvmediainputnode/android.m)

author的引擎部分(engines/author/android.mk)

為Android的author適配器(android/author/android.mk)

    libopencoreauthor.so中主要為各個文件編碼器和文件組成器,PVAuthor的核心功能在engines/author/Android.mk當中,而android/author/Android.mk是在PVAuthor之上構建的一個為android使用的媒體記錄器。

5.其他庫
       另外的幾個庫的android.mk文件的路徑如下所示:
網絡支持庫libopencorenet_support.so:
tools_v2/build/modules/Linux_net_support/core/android.mk

MP4功能實現庫libopencoremp4.so和注冊庫libopencoremp4reg.so:
tools_v2/build/modules/Linux_mp4/core/android.mk
tools_v2/build/modules/Linux_mp4/node_registry/android.mk

RTSP功能實現庫libopencorertsp.so和注冊庫libopencorertspreg.so:
tools_v2/build/modules/Linux_rtsp/core/android.mk
tools_v2/build/modules/Linux_rtsp/node_registry/android.mk

下載功能實現庫libopencoredownload.so和注冊庫libopencoredownloadreg.so:
tools_v2/build/modules/Linux_download/core/android.mk
tools_v2/build/modules/Linux_download/node_registry/android.mk


第三部分 OpenCore OSCL簡介

    OSCL,全稱為Operating System Compatibility Library (操作系統兼容庫),它包含了一些在不同操作系統中移植層的功能,其代碼結構如下所示:
oscl/oscl
|-- config             :配置的宏
|-- makefile
|-- makefile.pv
|-- osclbase         :包含基本類型、宏以及一些STL容器類似的功能
|-- osclerror        :錯誤處理的功能
|-- osclio             :文件IO和Socket等功能
|-- oscllib            :動態庫接口等功能
|-- osclmemory :內存管理、自動指針等功能
|-- osclproc         :線程、多任務通訊等功能
|-- osclregcli        :注冊客戶端的功能
|-- osclregserv     :注冊服務器的功能
`-- osclutil           :字符串等基本功能
         在oscl的目錄中,一般每一個目錄表示一個模塊。OSCL對應的功能是非常細致的,幾乎對C語言中每一個細節的功能都進行封裝,並使用了C++的接口提供給上層使用。事實上,OperCore中的PVMF、Engine部分都在使用OSCL,而整個OperCore的調用者也需要使用OSCL。
在OSCL的實現中,很多典型的C語言函數被進行了簡單的封裝,例如:osclutil中與數學相關的功能在oscl_math.inl中被定義成為了內嵌(inline)的函數:
OSCL_COND_EXPORT_REF OSCL_INLINE double oscl_log(double value)
{
         return (double) log(value);
}
OSCL_COND_EXPORT_REF OSCL_INLINE double oscl_log10(double value)
{
         return (double) log10(value);
}
OSCL_COND_EXPORT_REF OSCL_INLINE double oscl_sqrt(double value)
{
         return (double) sqrt(value);
}
         oscl_math.inl文件又被oscl_math.h所包含,因此其結果是oscl_log()等功能的使用等價於原始的log()等函數。

     很多C語言標准庫的句柄都被定義成為了C++類的形式,實現由一些繁瑣,但是復雜性都不是很高。以oscllib為例,其代碼結構如下所示:
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.h
        oscl_shared_library.h是提供給上層使用的動態庫的接口功能,它定義的接口如下所示:
class OsclSharedLibrary
{
public:
        OSCL_IMPORT_REF OsclSharedLibrary();
        OSCL_IMPORT_REF OsclSharedLibrary(const OSCL_String& aPath);
        OSCL_IMPORT_REF ~OsclSharedLibrary();
        OSCL_IMPORT_REF OsclLibStatus LoadLib(const OSCL_String& aPath);
        OSCL_IMPORT_REF OsclLibStatus LoadLib();
        OSCL_IMPORT_REF void SetLibPath(const OSCL_String& aPath);
        OSCL_IMPORT_REF OsclLibStatus QueryInterface(const OsclUuid& aInterfaceId, OsclAny*& aInterfacePtr);
        OSCL_IMPORT_REF OsclLibStatus Close();
        OSCL_IMPORT_REF void AddRef();
        OSCL_IMPORT_REF void RemoveRef();
}
        這些接口顯然都是與庫的加載有關系的,而在oscl_shared_library.cpp 中其具體的功能是使用dlopen()等函數來實現的。

第四部分 文件格式處理和編解碼部分簡介

  在多媒體方面,文件格式的處理和編解碼(Codec)是很基礎的兩個方面的內容。多媒體應用的兩個方面是媒體的播放(PlayBack)和媒體的記錄(Recording)。

  在媒體的播放過程中,通常情況是從對媒體文件的播放,必要的兩個步驟為文件的解析和媒體流的解碼。例如對於一個mp4的文件,其中可能包括AMR和AAC的音頻流,H263、MPEG4以及AVC(H264)的視頻流,這些流被封裝在3GP的包當中,媒體播放器要做的就是從文件中將這些流解析出來,然後對媒體流進行解碼,解碼後的數據才可以播放。

  在媒體的記錄過程中,通過涉及到視頻、音頻、圖像的捕獲功能。對於將視頻加音頻錄制成文件功能,其過程與播放剛好相反,首先從硬件設備得到視頻和音頻的媒體流,然後對其進行編碼,編碼號的流還需要被分層次寫入到文件之中,最終得到組成好的文件。

  OpenCore有關文件格式處理和編解碼部分兩部分的內容,分別在目錄fileformats和codecs_v2當中。這兩部分都屬於基礎性的功能,不涉及具體的邏輯,因此它們被別的模塊調用來使用,例如:構建各種Node。

  4.1 文件格式的處理

  由於同時涉及播放文件和記錄文件兩種功能,因此OpenCore中的文件格式處理有兩種類型,一種是parser(解析器),另一種是composer(組成器)。

  fileformats的目錄結構如下所示:fileformats
|-- avi
|   `-- parser
|-- common
|   `-- parser
|-- id3parcom
|   |-- android.mk
|   |-- build
|   |-- include
|   `-- src
|-- mp3
|   `-- parser
|-- mp4
|   |-- composer
|   `-- parser
|-- rawaac
|   `-- parser
|-- rawgsmamr
|   `-- parser
`-- wav
    `-- parser

        目錄包含各個子目錄中,它們對應的是不同的文件格式,例如mp3、mp4和wav等。

   4.2 編解碼

        編解碼部分主要針對Audio和Video,codecs_v2的目錄結構如下所示:
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
        在audio 和video目錄中,對應了針對各種流的子目錄,其中可能包含dec和enc兩個目錄,分別對應解碼和編碼。video目錄展開後的內容如下所示:
`-- video
    |-- avc_h264
    |   |-- common
    |   |-- dec
    |   |-- enc
    |   `-- patent_disclaimer.txt
    `-- m4v_h263
        |-- dec
        |-- enc
        `-- patent_disclaimer.txt
        codecs_v2目錄的子目錄omx實現了一個khronos 
        OpenMAX的功能。OpenMAX是一個多媒體應用程序的框架標准,由NVIDIA公司和Khronos在2006年推出。OpenMAX IL 1.0(集成層)技術規格定義了媒體組件接口,以便在嵌入式器件的流媒體框架中快速集成加速式編解碼器。
        OpenMAX的設計實現可以讓具有硬件編輯碼功能的平台提供統一的接口和框架,在OpenMAX中可以直接使用硬件加速的進行編解碼乃至輸出的功能,對外保持統一的接口。但是在此處的OpenMAX則是一個純軟件的實現。

 

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.Net/linweig/archive/2010/05/17/5600844.ASPx

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved