|
| 1 | +## 开发环境配置 |
| 2 | + |
| 3 | +### Mac下安装FFmpeg |
| 4 | + |
| 5 | +FFmpeg的学习看其源代码时需要下载他的仓库,直接读源码,其他场景下的编译都是自己根据自己的需求进行编译的,但是在Mac 中不需要进行编译就可以学习FFmpeg的各个API: |
| 6 | +``` |
| 7 | +brew install ffmpeg |
| 8 | +``` |
| 9 | +通过brew安装之后,ffmpeg需要的头文件和lib文件都会安装到/usr/local/X的位置,我的为: |
| 10 | +``` |
| 11 | +/usr/local/Cellar/ffmpeg/6.0 |
| 12 | +``` |
| 13 | +### xcode |
| 14 | + |
| 15 | +Xcode 创建一个Commond Line Tools 项目,选择C++/C都可 |
| 16 | +#### 配置Header、Library路径 |
| 17 | + |
| 18 | + |
| 19 | +#### 添加动态链接库 |
| 20 | +  |
| 21 | + |
| 22 | +#### main.cpp测试代码 |
| 23 | +```c++ |
| 24 | +#if defined(__cplusplus) |
| 25 | +extern "C" |
| 26 | +{ |
| 27 | +#endif |
| 28 | +#include "libavcodec/avcodec.h" |
| 29 | +#if defined(__cplusplus) |
| 30 | +} |
| 31 | +#endif |
| 32 | + |
| 33 | +#include <iostream> |
| 34 | + |
| 35 | +using namespace std; |
| 36 | + |
| 37 | +#include <iostream> |
| 38 | + |
| 39 | + |
| 40 | +int main(int argc, const char * argv[]) { |
| 41 | + // insert code here... |
| 42 | + std::cout << "Hello, World!\n"; |
| 43 | + cout << "avcodec_configuration : " << avcodec_configuration() << endl; |
| 44 | + return 0; |
| 45 | +} |
| 46 | +``` |
| 47 | +运行结果: |
| 48 | +``` |
| 49 | +Hello, World! |
| 50 | +avcodec_configuration : --prefix=/usr/local/Cellar/ffmpeg/6.0 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libaribb24 --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libsvtav1 --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox |
| 51 | +Program ended with exit code: 0 |
| 52 | +``` |
| 53 | +
|
| 54 | +### Android Studio配置FFmpeg开发环境 |
| 55 | +### 下载ffmpeg源码 |
| 56 | +下载ffmpeg的源码 |
| 57 | +官网地址:http://www.ffmpeg.org/download.html |
| 58 | +里面有Linux、macOS、Windows系统的版本,根据自己的需要下载对应的版本。下载完成后把源码放在你喜欢的路径,如:/Users/ccc/ffmpeg |
| 59 | +
|
| 60 | +### 修改FFmpeg目录下的configuration配置文件: |
| 61 | +
|
| 62 | + |
| 63 | +
|
| 64 | +然后搜索Toolchain options部分,增加: |
| 65 | +``` |
| 66 | +--cross-prefix-clang=PREFIX use PREFIX for compilation tools [$cross_prefix_clang] |
| 67 | +``` |
| 68 | + |
| 69 | +
|
| 70 | +再搜索CMDLINE_SET,也增加上面的自定义参数配置: |
| 71 | +
|
| 72 | +  |
| 73 | +
|
| 74 | +最后再搜索set_default target_os,进行一下修改: |
| 75 | +``` |
| 76 | +4436 set_default target_os |
| 77 | +4437 if test "$target_os" = android; then |
| 78 | +4438 cc_default="clang" |
| 79 | +4439 # 增长这一行 |
| 80 | +4440 cxx_default="clang++" |
| 81 | +4441 fi |
| 82 | +4442 |
| 83 | +4443 ar_default="${cross_prefix}${ar_default}" |
| 84 | +4444 # 修改这一行 |
| 85 | +4445 cc_default="${cross_prefix_clang}${cc_default}" |
| 86 | +4446 # 修改这一行 |
| 87 | +4447 cxx_default="${cross_prefix_clang}${cxx_default}" |
| 88 | +4448 nm_default="${cross_prefix}${nm_default}" |
| 89 | +``` |
| 90 | +
|
| 91 | +这样修改之后咱们在编译时就可使用咱们新增的cross_prefix_clang参数了,而后其余的如nm,ar,ranlib,strip则继续使用cross_prefix参数。 |
| 92 | +
|
| 93 | +为什么要这样改? |
| 94 | +首先,需要先了解编译库的流程。 |
| 95 | +①编写自定义的编译脚本 |
| 96 | +②脚本根据各个配置项,去寻找对应的库工具路径 |
| 97 | +③生成动态链接库 |
| 98 | +而上面的修改,目的就是为了第二步能正常找到对应的库工具。配置中的nm,ar,ranlib,strip这些的前缀,是arm-linux-androideabi-,而cc,cxx这两个是arm-linux-androideabi21-这样的前缀,而且他们放的位置也不一样。所以增加一个自定义的配置项,用于指向不同的目录。 |
| 99 | +
|
| 100 | +#### 编写编译脚本 |
| 101 | +在ffmepg的文件夹中新建一个文件夹build-android,里面再新建一个build-android.sh文件。 |
| 102 | +
|
| 103 | +```shell |
| 104 | +#!/bin/bash |
| 105 | +#NDK路径 |
| 106 | +export NDK=/Users/xxxx/Library/Android/sdk/ndk/21.0.6113669 |
| 107 | +#CPU类型 |
| 108 | +export CPU=armv8-a |
| 109 | +# 目标Android版本 |
| 110 | +API=21 |
| 111 | +#架构类型 |
| 112 | +export ARCH=arm |
| 113 | +export SYSROOT=$NDK/toolchains/llvm/prebuilt/darwin-x86_64/sysroot |
| 114 | +#交叉编译工具链 |
| 115 | +export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64 |
| 116 | +#编译成功后,存放的路径 |
| 117 | +export PREFIX=./build-android/dist |
| 118 | +
|
| 119 | +cd .. #回到ffmpeg根目录 |
| 120 | +
|
| 121 | +echo "start configure" |
| 122 | +./configure \ |
| 123 | +--prefix=$PREFIX \ |
| 124 | +--enable-shared \ |
| 125 | +--enable-cross-compile \ |
| 126 | +--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \ |
| 127 | +--cross-prefix-clang=$TOOLCHAIN/bin/armv7a-linux-androideabi21- \ |
| 128 | +--target-os=android --arch=$ARCH --cpu=$CPU \ |
| 129 | +--enable-gpl --enable-version3 \ |
| 130 | +--disable-programs --disable-ffmpeg --disable-ffplay --disable-ffprobe \ |
| 131 | +--disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages \ |
| 132 | +--disable-postproc \ |
| 133 | +--disable-debug \ |
| 134 | +--sysroot=$SYSROOT \ |
| 135 | +--extra-cflags="-I$SYSROOT/usr/include" \ |
| 136 | +--extra-ldflags="-L$SYSROOT/usr/lib" \ |
| 137 | +--enable-small \ |
| 138 | +--enable-jni \ |
| 139 | +--enable-mediacodec |
| 140 | +--disable-everything \ |
| 141 | +--enable-decoder=hevc --enable-decoder=h264 --enable-decoder=aac \ |
| 142 | +--enable-parser=h264 --enable-parser=hevc --enable-parser=aac \ |
| 143 | +--enable-demuxer=flv --enable-demuxer=mov --enable-demuxer=avi --enable-demuxer=mpegts \ |
| 144 | +--enable-protocol=file --enable-protocol=hls |
| 145 | + |
| 146 | +echo "make clean start" |
| 147 | +make clean |
| 148 | +echo "make start" |
| 149 | +make -j4 |
| 150 | +echo "make finished" |
| 151 | +make install |
| 152 | +echo "make install finished" |
| 153 | +``` |
| 154 | + |
| 155 | +cd到ffmpeg一级目录,然后执行以下的命令 |
| 156 | +``` |
| 157 | +chmod 777 build_android.sh //改变脚本权限,使其能够运行,然后 |
| 158 | +
|
| 159 | +./build_android.sh //运行脚本 |
| 160 | +``` |
| 161 | + |
| 162 | +等编译完成后,进入目录就能看到生成的库: |
| 163 | +  |
| 164 | + |
| 165 | + |
| 166 | + |
| 167 | +还有一个问题,就是能不能不修改configure文件? |
| 168 | +其实也是可以,只需要明确指定cc和cxx的路径就行。 |
| 169 | + |
| 170 | +--cc=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang \ |
| 171 | +--cxx=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang++ \ |
| 172 | +--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \ |
| 173 | +脚本部分配置项解释 |
| 174 | +1.—prefix:指定编译输出的文件路径 |
| 175 | +2.—target-os:指定目标操作系统 |
| 176 | +3.--disable-static:禁止生成静态库 |
| 177 | +4.—disable-programs:禁止生成ffplay、ffmpeg等可执行文件 |
| 178 | +5.—disable-doc:禁止生成文档 |
| 179 | +6.—enable-shared:生成动态链接库 |
| 180 | +7.enable-cross-compile:开启交叉编译(跨平台编译) |
| 181 | +8.make -j12:定义用几个CPU编译 |
| 182 | + |
| 183 | + |
| 184 | +到这里为止,就已经编译出我们需要的so库了,之后就是怎么在android项目中使用了。 |
| 185 | + |
| 186 | +### Android编译方式2 |
| 187 | + |
| 188 | +[ffmpeg-android-maker](https://github.com/Javernaut/ffmpeg-android-maker)项目已经把下载、编译都给写好了,我们要做的就是下载下来后, |
| 189 | +环境变量中配置ANDROID_SDK_HOME和ANDROID_NDK_HOME: |
| 190 | +``` |
| 191 | + export ANDROID_SDK_HOME=/Users/xuchuanren/Library/Android/sdk |
| 192 | + export ANDROID_NDK_HOME=/Users/xuchuanren/Library/Android/sdk/ndk/23.1.77796 20 |
| 193 | +``` |
| 194 | +然后运行进入目录执行: |
| 195 | +``` |
| 196 | +sh ffmpeg-android-maker.sh |
| 197 | +``` |
| 198 | +它会自动下载并编译android上可用的so,结果为: |
| 199 | +  |
| 200 | + |
| 201 | +#### 项目集成 |
| 202 | +新建项目,增加C++支持。手动创建jniLibs文件夹 |
| 203 | +然后将上一步生成的所有文件(库文件和头文件)复制到jniLibs文件夹下面 |
| 204 | +最终目录结构: |
| 205 | + |
| 206 | + |
0 commit comments