短视频、直播、视频会议等的出现让音视频在移动端出现爆发式的增长。然而音视频在移动端应用方面入门的门槛一向都比较高。由此心里萌发学习音视频方面技术的想法。
笔记系列如下:
Linux环境下 FFmpeg源码使用Android NDK 编译so库
一、FFmpeg源码下载
下载地址:http://www.ffmpeg.org/download.html
二、NDK下载:
下载地址:https://developer.android.google.cn/ndk/downloads
三、执行脚本准备
#!/bin/bash echo "进入FFmpeg编译" #将NDK的下载路径替换成你自己的NDK路径,我下载的r20b版本 NDK=/home/zhangqingfa/ndk/android-ndk-r20b PLATFORM=$NDK/platforms/android-21/arch-arm TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 #指定目标cpu的架构 armv7a aarch64 i686 x86_64 CPU= armv7-a #设置编译产物的输出目录,这里表示在当前目录下新建android目录 PREFIX=./android/$CPU function buildFF { echo "开始编译ffmpeg" ./configure \ --prefix=$PREFIX \ --target-os=android \ --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \ --arch=arm \ --cpu=armv7-a --sysroot=$PLATFORM \ --extra-cflags="-I$PLATFORM/usr/include -fPIC -DANDROID -mfpu=neon -mfLoat-abi=softfp " \ --cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \ --nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm \ --enable-shared \ --enable-runtime-cpudetect \ --enable-gpl \ --enable-small \ --enable-cross-compile \ --enable-asm \ --enable-neon \ --enable-jni \ --enable-mediacodec \ --enable-decoder=h264_mediacodec \ --enable-hwaccel=h264_mediacodec \ --disable-debug \ --disable-static \ --disable-doc \ --disable-ffmpeg \ --disable-ffplay \ --disable-ffprobe \ --disable-ffserver \ --disable-postproc \ --disable-avdevice \ --disable-stripping \ --disable-symver \ make -j 4 make install echo "编译结束!" } buildFF四、执行脚本得到so库
修改sh文件权限并且执行,编译期间需要一段时间:
五、最终结果如下:
FFmpeg编译得到的so库简介说明(后面实战会有详细记录)
libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能;音视频的格式解析协议,为 libavcodec 分析码流提供独立的音频或视频码流源。
libavcodec:用于各种类型声音/图像编解码。该库是音视频编解码核心,实现了市面上可见的绝大部分解码器的功能, libavcodec 库被其他各大解码器 ffdshow, Mplayer 等所包含或应用。
libavfilter:filter(FileIO、 FPS、 DrawText) 音视频滤波器的开发,如宽高比 裁剪 格式化 非格式化 伸缩。
libavutil:包含一些公共的工具函数的使用库,包括算数运算 字符操作。
libavresample:音视频封转编解码格式预设等。
libswscale:(原始视频格式转换) 用于视频场景比例缩放、色彩映射转换;图像颜色空间或格式转换,如 rgb565、rgb888 等与 yuv420 等之间转换。
libswresample:原始音频格式转码。
后面的笔记会有记录在android中如何使用FFmpeg编译的so库做一些实战。如有问题可留言讨论。欢迎指教。