zoukankan      html  css  js  c++  java
  • x264在Android平台上构建

      x264在通用linux平台上容易编译,但是如果想在Android平台上编译和使用,怎么做呢?

      我修改了一份,上传到了这里,这几个文件放到你的x264源码包的根目录下,就可以编译。

    说明几点:

    1. 编译产物

         共两个编译产物:libx264.so动态库和example测试demo

         并没有编译出x264这个可执行文件,因为还要添加诸多文件,还有一个主要的原因是x264.c可读性差。

         如果专门做编码器的,还可以做很多定制修改、编码参数精细控制,如果不是专门做这个领域的可能就要被搞晕。

         软件这个东西,你提供给别人的接口,要尽可能少和简单(这很重要),别人可能并不关心你的实现方式,人家只是想方便使用。

    2. config.h——配置信息

         这个文件本是在普通Linux下利用configure的脚本文件生成的(同时还会得到Makefile),它会根据硬件平台得到相应的宏参数。

         例如,如下几个:

    #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编码参数信息。

  • 相关阅读:
    Ubuntu安装adobe的Source Code Pro
    Oracle实现主键自增的几种方式
    Oracle主键自增
    activity 根据流程实例ID删除流程实例、删除流程部署
    解决报错:错误1130- Host xxx is not allowed to connect to this MariaDb server
    Idea-每次修改JS文件都需要重启Idea才能生效解决方法
    html中<a href> </a>的用法
    Mysql8_数据库基础操作
    java反射及Method的Invoke方法(转载)
    oracle查询数据插入时间
  • 原文地址:https://www.cnblogs.com/Dreaming-in-Gottingen/p/14269926.html
Copyright © 2011-2022 走看看