1 Star 0 Fork 0

liuziloong / FREYA-LIVE-LIBRARY-OPTIMIZER-FOR-ANDROID

Create your Gitee Account
Explore and code with more than 6 million developers,Free private repositories !:)
Sign up
Clone or download
Cancel
Notice: Creating folder will generate an empty file .keep, because not support in Git
Loading...
README.md

FREYA-LIVE-LIBRARY-OPTIMIZER-FOR-ANDROID

:zap:FREYA LIVE LIBRARY OPTIMIZER FOR ANDROID是一套RTMP直播推流常用库的编译简化/优化工具(面向安卓设备),简单配置后能一键完成库文件的编译与优化(FFMPEG+X264+FDKAAC+LIBRTMP/FFMPEG NATIVE RTMP+LIBYUV) 针对ARM、ARMV7-A、ARM64-V8A、X86、X86_64、MIPS、MIPS64全平台极致优化。参阅了大量技术文档确定优化选项,并经过了实机测试,是目前最好的RTMP推流库编译简化及优化工具 版本:1.0.2 更新日期:2017.01.11 一、需准备的编译环境 1.操作系统:LINUX X64 (推荐UBUNTU-12.04.5-DESKTOP-AMD64或以上版本) 2.NDK版本:R13或以上版本 (本工具目前采用GCC编译所有库文件,因此NDK中必须包含GCC编译器。而从NDK R13开始谷歌停止了对GCC的更新,转用CLANG作为默认编译器,且在CLANG编译器稳定后有移除GCC的计划,但就目前而言还是GCC更有优势,在GCC被正式移除后我会开发对应CLANG的编译脚本) 3.编译X86/X86_64库文件需要安装:YASM 1.3.0或以上版本 二、编译脚本与库文件的对应关系 1.freya_compile_arm.sh用于编译ARM库文件 2.freya_compile_armv7a.sh用于编译ARMV7-A库文件 3.freya_compile_arm64v8a.sh用于编译ARM64-V8A库文件 4.freya_compile_x86.sh用于编译X86库文件 5.freya_compile_x86_64.sh用于编译X86_64库文件 6.freya_compile_mips.sh用于编译MIPS库文件 7.freya_compile_mips64.sh用于编译MIPS64库文件 三、如何使用本工具 1.按照第二部分所述对应关系,找到需要使用的编译脚本,并为脚本中需要配置的变量赋值 2.找到CURRENT_PATH变量,配置本脚本所在的目录位置 3.找到NDKROOT_PATH变量,配置NDK所在目录位置 4.FFMPEG_RTMP_OPTIONS变量可以配置使用LIBRTMP(RTMPDUMP)还是FFMPEG NATIVE RTMP作为RTMP推流库,默认使用LIBRTMP(RTMPDUMP) 5.PREBUILT_TOOL_*_PATH变量可以配置对应各平台的TOOLCHAIN目录与程序名,需要配置到TOOLCHAIN程序文件名共有的前半段,一般无需修改(*代表ARM、ARMV7A、ARM64V8A、X86、X86_64、MIPS、MIPS64) 6.PLATFORM_*_PATH变量可以配置对应各平台的ANDROID API目录(*代表ARM、ARMV7A、ARM64V8A、X86、X86_64、MIPS、MIPS64) 7.PLATFORM_*_API变量可以配置对应各平台的ANDROID API级别(必须与PLATFORM_*_PATH相对应,*代表ARM、ARMV7A、ARM64V8A、X86、X86_64、MIPS、MIPS64) 8.PLATFORM_NDK_TOOLCHAIN_VERSION变量可以配置对应各平台的TOOLCHAIN版本,默认为4.9,一般无需修改 9.对于X86/X86_64平台而言,必须使用YASM_*_PATH变量指出YASM编译器的所在位置(*代表X86、X86_64) 10.脚本中对于以上变量的配置均有详细注释,在配置时可以参考 11.配置完成后使用root用户运行对应各平台的编译脚本即可,编译完成后在freya_build_finished目录会生成相应的库文件 12.如果freya_build_finished/平台名/lib目录中生成如下.a文件,则编译成功: FFMPEG:libavcodec.a、libavdevice.a、libavfilter.a、libavformat.a、libavresample.a、libavutil.a、libpostproc.a、libswresample.a、libswscale.a X264:libx264.a FDKAAC:libfdk-aac.a LIBRTMP(RTMPDUMP):librtmp.a POLARSSL:libpolarssl.a LIBYUV:libyuv.a 13.用户可以自行替换ffmpeg、x264、fdkaac、rtmpdump、polarssl、libyuv目录下的文件进行组件版本更换 四、当前源码版本 1.FFMPEG 3.2.2 RELEASE 2.X264 2017.01.10 STABLE 3.FDKAAC 0.1.5 2017.01.11 FROM MSTORSJO 4.LIBRTMP(RTMPDUMP) 2.4 5.POLARSSL 1.2.19 6.LIBYUV REV 1638 会定期更新FFMPEG、FDKAAC、X264、LIBYUV的版本,并进行编译与实机推流测试,一般2-3个月更新一次 由于官方已经停止了LIBRTMP(RTMPDUMP)的维护,因此LIBRTMP(RTMPDUMP)、POLARSSL一般不会更新,除非官方再次更新 五、优化方案 本编译脚本针对ARM、ARMV7-A、ARM64-V8A、X86、X86_64、MIPS、MIPS64全平台极致优化。参阅了大量技术文档确定优化选项,具体优化方案如下 1.ARM优化方案: FFMPEG: VFP+针对ARMV5TE的CPU调优 X264: VFP+多核多线程优化+针对ARMV5TE的CPU调优 FDKAAC: VFP+针对ARMV5TE的CPU调优 LIBRTMP: 针对ARMV5TE的CPU调优 POLARSSL: 汇编优化+针对ARMV5TE的CPU调优 LIBYUV: VFP+针对ARMV5TE的CPU调优 2.ARMV7-A优化方案: FFMPEG: NEON指令集+VFPV3+针对ARMV7-A的CPU调优 X264: NEON指令集+VFPV3+多核多线程优化+针对ARMV7-A的CPU调优 FDKAAC: NEON指令集+VFPV3+针对ARMV7-A的CPU调优 LIBRTMP: 针对ARMV7-A的CPU调优 POLARSSL: 汇编优化+针对ARMV7-A的CPU调优 LIBYUV: NEON指令集+VFPV3+针对ARMV7-A的CPU调优 3.ARM64-V8A优化方案: FFMPEG: NEON指令集+VFPV4+针对ARM64-V8A的CPU调优 X264: NEON指令集+VFPV4+多核多线程优化+针对ARM64-V8A的CPU调优 FDKAAC: NEON指令集+VFPV4+针对ARM64-V8A的CPU调优 LIBRTMP: 针对ARM64-V8A的CPU调优 POLARSSL: 汇编优化+针对ARM64-V8A的CPU调优 LIBYUV: NEON指令集+VFPV4+针对ARM64-V8A的CPU调优 4.X86/X86_64优化方案: FFMPEG: SSSE3指令集+汇编优化+针对ATOM的CPU调优 X264: SSSE3指令集+汇编优化+多核多线程优化+针对ATOM的CPU调优 FDKAAC: 针对ATOM的CPU调优 LIBRTMP: 针对ATOM的CPU调优 POLARSSL: 汇编优化+SSE2指令集+针对ATOM的CPU调优 LIBYUV: SSSE3指令集+针对ATOM的CPU调优 5.MIPS优化方案: FFMPEG: DSP R2+MSA+MIPS FPU+针对MIPS32R2的CPU调优 X264: DSP R2+MSA+MIPS FPU+多核多线程优化+针对MIPS32R2的CPU调优 FDKAAC: DSP R2+MSA+MIPS FPU+针对MIPS32R2的CPU调优 LIBRTMP: 针对MIPS32R2的CPU调优 POLARSSL: 汇编优化+针对MIPS32R2的CPU调优 LIBYUV: DSP R2+MIPS FPU+针对MIPS32R2的CPU调优 6.MIPS64优化方案: FFMPEG: DSP R2+MSA+MIPS FPU+针对MIPS64R6的CPU调优 X264: DSP R2+MSA+MIPS FPU+多核多线程优化+针对MIPS64R6的CPU调优 FDKAAC: DSP R2+MSA+MIPS FPU+针对MIPS64R6的CPU调优 LIBRTMP: 针对MIPS64R6的CPU调优 POLARSSL: 汇编优化+针对MIPS64R6的CPU调优 LIBYUV: MIPS FPU+针对MIPS64R6的CPU调优 六、为何选用此套组件作为直播推流方案 1.为何选择X264作为H264编码器 目前流行的开源H264编码器主要有:X264与OPENH264 X264作为H264编码器,主要有以下优势: (1)X264(SUPERFAST模式)与OPENH264速度、画质持平,X264(ULTRAFAST模式)比OPENH264快20%-30%,X264能适合更多低端设备推流,在高端设备上也能通过调节参数获得更好的性能与画质表现 (2)X264编码器拥有更丰富的调节选项,OPENH264可调的选项很少 (3)X264支持BASELINE、MAIN、HIGH三种PROFILE,OPENH264仅支持BASELINE。在高端设备上通过提高PROFILE的等级(会增加CPU的计算量),在同画质下可节省带宽。 2.为何选择FDKAAC作为AAC编码器 FDKAAC作为AAC编码器,主要有以下优势: (1)FDKAAC是目前音质最好的AAC编码器。从FFMPEG 3.0开始,FFMPEG的NATIVE AAC编码器虽有大幅改进(已经优于除FDKAAC外的其他AAC编码器),但仍落后于FDKAAC (2)FDKAAC有很好的性能表现 (3)FDKAAC是目前唯一支持HE的AAC编码器。高端设备使用HE模式(会增加CPU的计算量),在服务器支持的情况下,同音质下可节省带宽 3.为何选择LIBRTMP(RTMPDUMP)/FFMPEG NATIVE RTMP作为RTMP推流库 LIBRTMP(RTMPDUMP)作为推流库,主要有以下优势: (1)LIBRTMP(RTMPDUMP)支持全RTMP协议(RTMP RTMPT RTMPE RTMPTE RTMPS)推流,FFMPEG新版本目前虽然也支持全RTMP协议,但兼容性不如LIBRTMP(RTMPDUMP) FFMPEG NATIVE RTMP作为推流库,主要有以下优势: (1)FFMPEG NATIVE RTMP仍有官方维护,可获得来自官方的代码更新。而LIBRTMP(RTMPDUMP)缺少官方维护 4.为何选择POLARSSL作为SSL库 (1)使用POLARSSL可以让LIBRTMP(RTMPDUMP)支持RTMPT RTMPE RTMPTE RTMPS协议 (2)POLARSSL支持汇编优化+SSE2指令集优化 (3)POLARSSL比OPENSSL更小巧 5.为何选择LIBYUV作为视频操作/转换库 LIBYUV作为视频操作/转换库,主要有以下优势: (1)LIBYUV支持NEON优化(ARMV7-A/ARM64-V8A),SSE2/SSSE3/AVX2优化(X86/X86_64),DSP R2优化(MIPS32/MIPS64),性能远超FFMPEG自带的LIBSWSCALE 作者:jkkj93

Comments ( 0 )

Sign in for post a comment

Releases

No release

Contributors

All

Activities

load more
can not load any more
1
https://gitee.com/liuziloong/FREYA-LIVE-LIBRARY-OPTIMIZER-FOR-ANDROID.git
git@gitee.com:liuziloong/FREYA-LIVE-LIBRARY-OPTIMIZER-FOR-ANDROID.git
liuziloong
FREYA-LIVE-LIBRARY-OPTIMIZER-FOR-ANDROID
FREYA-LIVE-LIBRARY-OPTIMIZER-FOR-ANDROID
master

Search