x264在Android平臺上構建

  x264在通用linux平臺上容易編譯,可是若是想在Android平臺上編譯和使用,怎麼作呢?linux

  我修改了一份,上傳到了這裏,這幾個文件放到你的x264源碼包的根目錄下,就能夠編譯。android

說明幾點:git

1. 編譯產物github

     共兩個編譯產物:libx264.so動態庫和example測試demoapi

     並無編譯出x264這個可執行文件,由於還要添加諸多文件,還有一個主要的緣由是x264.c可讀性差。多線程

     若是專門作編碼器的,還能夠作不少定製修改、編碼參數精細控制,若是不是專門作這個領域的可能就要被搞暈。ide

     軟件這個東西,你提供給別人的接口,要儘量少和簡單(這很重要),別人可能並不關心你的實現方式,人家只是想方便使用。測試

2. config.h——配置信息編碼

     這個文件本是在普通Linux下利用configure的腳本文件生成的(同時還會獲得Makefile),它會根據硬件平臺獲得相應的宏參數。spa

     例如,以下幾個:

#define ARCH_ARM 1

#define SYS_LINUX 1

#define HAVE_BITDEPTH8 1

#define HAVE_BITDEPTH10 0

  這裏我只是借用Linux下生成的,只是要稍微改動一下。

3. 是否使用匯編?

     爲了加速編碼,不一樣的硬件平臺有不一樣的指令集來加速,例如x86下有mmx指令集,arm下有neon指令集。

     這份提供的Android.mk中,把調用硬件指令集的原文件都刪除了,不參與編譯。

     所以,能夠看到,example運行速度是比較慢的,在某個雙核手機平臺(cortex-A7)下,640x620分辨率圖像,編碼一幀耗時約1s,該進程佔用45%左右的cpu(沒使用多線程)。

4. 文件格式

     從Linux平臺下的Makefile中,能夠看到:

SRCS = common/osdep.c common/base.c common/cpu.c common/tables.c \
       encoder/api.c

SRCS_X = common/mc.c common/predict.c common/pixel.c common/macroblock.c \
         common/frame.c common/dct.c common/cabac.c \
         common/common.c common/rectangle.c \
         common/set.c common/quant.c common/deblock.c common/vlc.c \
         common/mvpred.c common/bitstream.c \
         encoder/analyse.c encoder/me.c encoder/ratecontrol.c \
         encoder/set.c encoder/macroblock.c encoder/cabac.c \
         encoder/cavlc.c encoder/encoder.c encoder/lookahead.c

SRCS_8 =

SRCCLI = x264.c autocomplete.c input/input.c input/timecode.c input/raw.c \
         input/y4m.c output/raw.c output/matroska.c output/matroska_ebml.c \
         output/flv.c output/flv_bytestream.c filters/filters.c \
         filters/video/video.c filters/video/source.c filters/video/internal.c \
         filters/video/resize.c filters/video/fix_vfr_pts.c \
         filters/video/select_every.c filters/video/crop.c

SRCCLI_X = filters/video/cache.c filters/video/depth.c
SRCCLI是參與編譯x264這個bin文件的源碼列表,
SRCS_X是編譯出libx264.so這個動態庫的源碼列表。
CLI是client的縮寫,因其是測試libx264.so這個動態庫的,所以可稱爲client,這是行業術語。

  在SRCCLI的源碼列表中,能夠看到flv/matroska的關鍵詞,這是控制輸出文件格式flv/mkv的。

  針對mp4文件格式,須要依賴這兩個庫中的一個存在:

ifneq ($(findstring HAVE_GPAC 1, $(CONFIG)),)
SRCCLI += output/mp4.c
endif

ifneq ($(findstring HAVE_LSMASH 1, $(CONFIG)),)
SRCCLI += output/mp4_lsmash.c
endif

  通常來講,爲減輕麻煩,我就讓編碼器出裸碼流,方便測試,但須要注意一點,第一幀數據必須爲sps/pps編碼參數信息。

相關文章
相關標籤/搜索