红联Linux门户
Linux帮助

Ubuntu下将VP9移植到Android

发布时间:2015-10-23 15:33:51来源:linux网站作者:yangxiao_xiang

最近想把VP9移植到Android手机上,折腾了很久,终于搞定,现在把方法和大家共享一下。


准备工作:

1、操作系统Ubuntu 12.04

2、下载 android-ndk32-r10d-linux-x86_64.tar.bz2

3、安装yasm,安装方法可以网上搜索

4、下载源代码,可采用以下3种途径

a  网站:http://www.webmproject.org/

b  Linux平台

git clone https://github.com/webmproject/libvpx

c  或者直接网上下载libvpx-1.4.0。(当前编译采用这个版本)


配置NDK环境

采用的NDK的版本为android-ndk32-r10d-linux-x86_64

打开profile文件

sudo gedit /etc/profile 

在profile文件末尾加上如下参数:

export ARM_ROOT=/home/willman/Projects/android_tools/ndk 
export PATH=$ARM_ROOT:$PATH 
export ARM_INC=$ARM_ROOT/platforms/android-21/arch-arm/usr/include/ 
export ARM_LIB=$ARM_ROOT/platforms/android-21/arch-arm/usr/lib/ 
export ARM_TOOL=$ARM_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 
export ARM_LIBO=$ARM_TOOL/lib/gcc/arm-linux-androideabi/4.9 
export PATH=$ARM_TOOL/bin:$PATH 
export ARM_PRE=arm-linux-androideabi 

装载环境变量

source /etc/profile 

验证是否装载成功

ndk-build -v 

Ubuntu下将VP9移植到Android


编译脚本

进入libvpx-1.4.0文件夹后,cd build/ :

编译为libvpx.a

../configure --target=armv7-android-gcc--sdk-path=$ARM_ROOT --prefix=/usr/local/android/--disable-examples--extra-cflags="-mfloat-abi=softfp -mfpu=neon"

编译为可执行文件

../configure --target=armv7-android-gcc--sdk-path=$ARM_ROOT --prefix=/usr/local/android/--disable-examples--extra-cflags="-mfloat-abi=softfp -mfpu=neon"–disable-runtime-cpu-detect

注:–disable-runtime-cpu-detect会报错,所以需要禁用,解决办法参考:http://blog.csdn.net/kl222/article/details/23101115

注:直接把--enable-examples会报错,所以不能直接用完整示例,所以采用simple_encoder这个示例。需要对examples.mk这个文件继续修改,修改如下:

# List ofexamples to build. UTILS are tools meant for distribution

# whileEXAMPLES demonstrate specific portions of the API.

UTILS-$(CONFIG_DECODERS)   += vpxdec.c

vpxdec.SRCS+= md5_utils.c md5_utils.h

vpxdec.SRCS+= vpx_ports/mem_ops.h

vpxdec.SRCS+= vpx_ports/mem_ops_aligned.h

vpxdec.SRCS+= vpx_ports/vpx_timer.h

vpxdec.SRCS+= vpx/vpx_integer.h

vpxdec.SRCS+= args.c args.h

vpxdec.SRCS+= ivfdec.c ivfdec.h

vpxdec.SRCS+= tools_common.ctools_common.h

vpxdec.SRCS+= y4menc.c y4menc.h

ifeq($(CONFIG_LIBYUV),yes)

vpxdec.SRCS += $(LIBYUV_SRCS)

endif

ifeq($(CONFIG_WEBM_IO),yes)

vpxdec.SRCS += $(LIBWEBM_PARSER_SRCS)

vpxdec.SRCS += webmdec.cc webmdec.h

endif

vpxdec.GUID =BA5FE66F-38DD-E034-F542-B1578C5FB950

vpxdec.DESCRIPTION  = Full featured decoder

UTILS-$(CONFIG_ENCODERS)   += vpxenc.c

vpxenc.SRCS+= args.c args.h y4minput.cy4minput.h vpxenc.h

vpxenc.SRCS+= ivfdec.c ivfdec.h

vpxenc.SRCS+= ivfenc.c ivfenc.h

vpxenc.SRCS+= rate_hist.c rate_hist.h

vpxenc.SRCS+= tools_common.ctools_common.h

vpxenc.SRCS+= warnings.c warnings.h

vpxenc.SRCS += vpx_ports/mem_ops.h

vpxenc.SRCS+= vpx_ports/mem_ops_aligned.h

vpxenc.SRCS+= vpx_ports/vpx_timer.h

vpxenc.SRCS+= vpxstats.c vpxstats.h

ifeq($(CONFIG_LIBYUV),yes)

vpxenc.SRCS += $(LIBYUV_SRCS)

endif

ifeq($(CONFIG_WEBM_IO),yes)

vpxenc.SRCS += $(LIBWEBM_MUXER_SRCS)

vpxenc.SRCS += webmenc.cc webmenc.h

endif

vpxenc.GUID =548DEC74-7A15-4B2B-AFC3-AA102E7C25C1

vpxenc.DESCRIPTION   = Full featured encoder

ifeq($(CONFIG_SPATIAL_SVC),yes)

EXAMPLES-$(CONFIG_VP9_ENCODER)  += vp9_spatial_svc_encoder.c

vp9_spatial_svc_encoder.SRCS+= args.c args.h

vp9_spatial_svc_encoder.SRCS+= ivfenc.c ivfenc.h

vp9_spatial_svc_encoder.SRCS+= tools_common.c tools_common.h

vp9_spatial_svc_encoder.SRCS+= video_common.h

vp9_spatial_svc_encoder.SRCS+= video_writer.h video_writer.c

vp9_spatial_svc_encoder.SRCS+= vpxstats.c vpxstats.h

vp9_spatial_svc_encoder.GUID= 4A38598D-627D-4505-9C7B-D4020C84100D

vp9_spatial_svc_encoder.DESCRIPTION = VP9Spatial SVC Encoder

endif

ifneq($(CONFIG_SHARED),yes)

EXAMPLES-$(CONFIG_VP9_ENCODER)+= resize_util.c

endif

EXAMPLES-$(CONFIG_ENCODERS) += vpx_temporal_svc_encoder.c

vpx_temporal_svc_encoder.SRCS   += ivfenc.c ivfenc.h

vpx_temporal_svc_encoder.SRCS   += tools_common.c tools_common.h

vpx_temporal_svc_encoder.SRCS   += video_common.h

vpx_temporal_svc_encoder.SRCS   += video_writer.h video_writer.c

vpx_temporal_svc_encoder.GUID   = B18C08F2-A439-4502-A78E-849BE3D60947

vpx_temporal_svc_encoder.DESCRIPTION= Temporal SVC Encoder

EXAMPLES-$(CONFIG_DECODERS)+= simple_decoder.c

simple_decoder.GUID =D3BBF1E9-2427-450D-BBFF-B2843C1D44CC

simple_decoder.SRCS+= ivfdec.h ivfdec.c

simple_decoder.SRCS+= tools_common.htools_common.c

simple_decoder.SRCS+= video_common.h

simple_decoder.SRCS+= video_reader.hvideo_reader.c

simple_decoder.SRCS+= vpx_ports/mem_ops.h

simple_decoder.SRCS+= vpx_ports/mem_ops_aligned.h

simple_decoder.DESCRIPTION  = Simplified decoder loop

EXAMPLES-$(CONFIG_DECODERS)   += postproc.c

postproc.SRCS += ivfdec.h ivfdec.c

postproc.SRCS += tools_common.htools_common.c

postproc.SRCS += video_common.h

postproc.SRCS += video_reader.h video_reader.c

postproc.SRCS += vpx_ports/mem_ops.h

postproc.SRCS +=vpx_ports/mem_ops_aligned.h

postproc.GUID  =65E33355-F35E-4088-884D-3FD4905881D7

postproc.DESCRIPTION   = Decoder postprocessor control

EXAMPLES-$(CONFIG_DECODERS)   += decode_to_md5.c

decode_to_md5.SRCS+= md5_utils.h md5_utils.c

decode_to_md5.SRCS+= ivfdec.h ivfdec.c

decode_to_md5.SRCS+= tools_common.htools_common.c

decode_to_md5.SRCS+= video_common.h

decode_to_md5.SRCS+= video_reader.hvideo_reader.c

decode_to_md5.SRCS+= vpx_ports/mem_ops.h

decode_to_md5.SRCS+= vpx_ports/mem_ops_aligned.h

decode_to_md5.GUID =59120B9B-2735-4BFE-B022-146CA340FE42

decode_to_md5.DESCRIPTION  = Frame by frame MD5 checksum

EXAMPLES-$(CONFIG_ENCODERS) += simple_encoder.c

simple_encoder.SRCS += ivfenc.h ivfenc.c

simple_encoder.SRCS += tools_common.h tools_common.c

simple_encoder.SRCS += video_common.h

simple_encoder.SRCS += video_writer.h video_writer.c

simple_encoder.GUID  = 4607D299-8A71-4D2C-9B1D-071899B6FBFD

simple_encoder.DESCRIPTION   = Simplified encoder loop

EXAMPLES-$(CONFIG_VP9_ENCODER) += vp9_lossless_encoder.c

vp9_lossless_encoder.SRCS  += ivfenc.h ivfenc.c

vp9_lossless_encoder.SRCS  += tools_common.h tools_common.c

vp9_lossless_encoder.SRCS  += video_common.h

vp9_lossless_encoder.SRCS  += video_writer.h video_writer.c

vp9_lossless_encoder.GUID   = B63C7C88-5348-46DC-A5A6-CC151EF93366

vp9_lossless_encoder.DESCRIPTION= Simplified lossless VP9 encoder

EXAMPLES-$(CONFIG_ENCODERS)+= twopass_encoder.c

twopass_encoder.SRCS   += ivfenc.h ivfenc.c

twopass_encoder.SRCS   += tools_common.h tools_common.c

twopass_encoder.SRCS   += video_common.h

twopass_encoder.SRCS   += video_writer.h video_writer.c

twopass_encoder.GUID=73494FA6-4AF9-4763-8FBB-265C92402FD8

twopass_encoder.DESCRIPTION = Two-pass encoder loop

EXAMPLES-$(CONFIG_DECODERS)+= decode_with_drops.c

decode_with_drops.SRCS += ivfdec.h ivfdec.c

decode_with_drops.SRCS += tools_common.h tools_common.c

decode_with_drops.SRCS += video_common.h

decode_with_drops.SRCS += video_reader.h video_reader.c

decode_with_drops.SRCS += vpx_ports/mem_ops.h

decode_with_drops.SRCS += vpx_ports/mem_ops_aligned.h

decode_with_drops.GUID  =CE5C53C4-8DDA-438A-86ED-0DDD3CDB8D26

decode_with_drops.DESCRIPTION   = Drops frames while decoding

EXAMPLES-$(CONFIG_ENCODERS)   += set_maps.c

set_maps.SRCS  += ivfenc.h ivfenc.c

set_maps.SRCS += tools_common.htools_common.c

set_maps.SRCS += video_common.h

set_maps.SRCS += video_writer.hvideo_writer.c

set_maps.GUID  =ECB2D24D-98B8-4015-A465-A4AF3DCC145F

set_maps.DESCRIPTION   = Set active and ROI maps

EXAMPLES-$(CONFIG_VP8_ENCODER)+= vp8cx_set_ref.c

vp8cx_set_ref.SRCS+= ivfenc.h ivfenc.c

vp8cx_set_ref.SRCS += tools_common.h tools_common.c

vp8cx_set_ref.SRCS+= video_common.h

vp8cx_set_ref.SRCS+= video_writer.hvideo_writer.c

vp8cx_set_ref.GUID =C5E31F7F-96F6-48BD-BD3E-10EBF6E8057A

vp8cx_set_ref.DESCRIPTION  = VP8 set encoder reference frame

ifeq($(CONFIG_MULTI_RES_ENCODING),yes)

ifeq($(CONFIG_LIBYUV),yes)

EXAMPLES-$(CONFIG_VP8_ENCODER) += vp8_multi_resolution_encoder.c

vp8_multi_resolution_encoder.SRCS  += ivfenc.h ivfenc.c

vp8_multi_resolution_encoder.SRCS  += tools_common.h tools_common.c

vp8_multi_resolution_encoder.SRCS  += video_writer.h video_writer.c

vp8_multi_resolution_encoder.SRCS  += $(LIBYUV_SRCS)

vp8_multi_resolution_encoder.GUID   = 04f8738e-63c8-423b-90fa-7c2703a374de

vp8_multi_resolution_encoder.DESCRIPTION= VP8 Multiple-resolution Encoding

endif

endif

# Handleextra library flags depending on codec configuration


编译完整examples(enable-cpu-detect)

../configure --target=armv7-android-gcc --sdk-path=$ARM_ROOT --prefix=/usr/local/android/ --disable-install-docs --extra-cflags="-mfloat-abi=softfp -mfpu=neon " --disable-debug --disable-debug-libs --disable-shared --enable-static --disable-webm-io


移植命令终端到你的Ubuntu桌面:http://www.linuxdiyf.com/linux/6903.html