最近项目需要做ffmpeg的armV8(64位)的动态库的编译,所以研究下。
背景知识:
FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它包括了领先的音/视频编码库 libavcodec 等。
libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能;音视频的格式解析协议,为 libavcodec 分析码流提供独立的音频或视频码流源。
libavcodec:用于各种类型声音/图像编解码;该库是音视频编解码核心,实现了市面上可见的绝大部分解码器的功能,libavcodec 库被其他各大解码器 ffdshow,Mplayer 等所包含或应用。
libavdevice :硬 件 采 集 、 加 速 、 显 示 。 操 作 计 算 机 中 常 用 的 音 视 频 捕 获 或 输 出 设 备 :ALSA,AUDIO_BEOS,JACK,OSS,1394,VFW。
libavfilter:filter(FileIO、FPS、DrawText)音视频滤波器的开发,如宽高比 裁剪 格式化 非格式化 伸缩。
libavutil:包含一些公共的工具函数的使用库,包括算数运算 字符操作;
libavresample:音视频封转编解码格式预设等。
libswscale:(原始视频格式转换)用于视频场景比例缩放、色彩映射转换;图像颜色空间或格式转换,如 rgb565,rgb888 等与 yuv420 等之间转换。
libswresample:原始音频格式转码
libpostproc:(同步、时间计算的简单算法)用于后期效果处理;音视频应用的后处理,如图像的去块效应。
ffmpeg:该项目提供的一个工具,可用于格式转换、解码或电视卡即时编码等;
ffsever:一个 HTTP 多媒体即时广播串流服务器;
ffplay:是一个简单的播放器,使用 ffmpeg 库解析和解码,通过 SDL 显示
转自
一、编译环境搭建
环境配置:
VMWare Workstation 12(VMware-workstation-full-12.5.7.20721 激活码自行百度)
软件安装_VMware Workstation 12 Pro 安装_百度经验
ubuntu(ubuntu-16.04.2-desktop-amd64.iso)
怎样在VMware虚拟机中使用安装并设置Ubuntu系统_百度经验
ndk (android-ndk-r10d-linux-x86_64.bin)
下载地址(请用迅雷下载,你懂的)
ffmpeg(ffmpeg-3.3.2.tar.bz2)
下载地址
这玩意儿挺简单的,
ndk这个直接 ./android-ndk-r10d-linux-x86_64.bin
ffmpeg这个就 tar -jxvf ffmpeg-3.3.2.tar.bz2
不细说了,如果安装有问题可以找我。
二、编译脚本
其实我是参考了几个脚本改出来的,这里是arm64位的,什么v6 v7脚本,网上一大堆,直接就能用。
v8的成熟的反正我没找到,现在给出我改的脚本吧
如果你用的ndk跟我一样,只需要ANDROID_NDK_ROOT就行,这个是你解压的路径
#!/bin/bash
mkdir -p ./build/android
chmod 777 ./configure
chmod 777 ./version.sh
export ANDROID_NDK_ROOT=/home/yuki/ndk10d/android-ndk-r10d
export ARM_ROOT=$ANDROID_NDK_ROOT
export ARM_INC=$ARM_ROOT/platforms/android-21/arch-arm64/usr/include/
export ARM_LIB=$ARM_ROOT/platforms/android-21/arch-arm64/usr/lib
export ARM_TOOL=$ARM_ROOT/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64
export ARM_LIBO=$ARM_TOOL/lib/gcc/aarch64-linux-android/4.9.x
export PATH=$ARM_TOOL/bin:$PATH
export ARM_PRE=arm-linux-androideabi
export PLATFORM=$ARM_ROOT/platforms/android-21/arch-arm64
CC=$ARM_ROOT/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin
function build_one
{
./configure \
--target-os=linux \
--arch=aarch64 \
--enable-cross-compile \
--sysroot=$ARM_ROOT/platforms/android-21/arch-arm64 \
--cross-prefix=$ARM_TOOL/bin/aarch64-linux-android- \
--cc=$ARM_TOOL/bin/aarch64-linux-android-gcc \
--nm=$ARM_TOOL/bin/aarch64-linux-android-nm \
--extra-cflags="-fvisibility=hidden -fdata-sections -ffunction-sections -Os -fPIC -DANDROID -DHAVE_SYS_UIO_H=1 -Dipv6mr_interface=ipv6mr_ifindex -fasm -Wno-psabi -fno-short-enums -fno-strict-aliasing -finline-limit=300" \
--enable-shared \
--enable-static \
--disable-asm \
--enable-pic \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-avdevice \
--disable-doc \
--disable-symver \
--disable-debug \
--disable-encoders \
--disable-muxers \
--enable-avresample \
--disable-pthreads \
--enable-swresample \
make clean
make
}
build_one
$ARM_TOOL/bin/aarch64-linux-android-ar d libavcodec/libavcodec.a inverse.o golomb.o log2_tab.o reverse.o
$ARM_TOOL/bin/aarch64-linux-android-ar d libswresample/libswresample.a log2_tab.o
$ARM_TOOL/bin/aarch64-linux-android-ar d libavutil/libavutil.a log2_tab.o
$ARM_TOOL/bin/aarch64-linux-android-ar d libswscale/libswscale.a log2_tab.o
$ARM_TOOL/bin/aarch64-linux-android-ld \
-rpath-link=$ARM_LIB \
-L$PLATFORM/usr/lib \
-soname libffmpeg-8.so -shared -nostdlib -znoexecstack -Bsymbolic --whole-archive --no-undefined -o \
./android/libffmpeg-8.so \
libswresample/libswresample.a \
libavcodec/libavcodec.a \
libavformat/libavformat.a \
libavutil/libavutil.a \
libswscale/libswscale.a \
-lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker \
$ARM_TOOL/lib/gcc/aarch64-linux-android/4.9/libgcc.a
注意几个配置
--enable-shared 这个是编译出分散的.so
--enable-static 这个是编译出分散的.a
其实,执行build_one就能出来能用的.so了,不过有好几个,我们这边要求打成一个so包,于是有了下面那几行。
这个脚本放到ffmpeg的根目录下
我那个叫build_android_64.sh,给了可执行权限后直接执行
./build_android_64.sh
成功后可以查看下是否生成libffmpeg-8.so
接下来是应用了,我在研究,但是代码是公司的,所以不会写文章。。。