Android 记录在macOS上使用 NDK20 编译ffmpeg4.2.2的过程
文章目录
前言
ijkplayer 的 ffmpeg 是旧版本的, ndk 也是旧的, 程序员爱折腾, 所以想用最新的 ndk 编译最新的 ffmpeg, 当前就是 ndk20+ffmpeg4.2.2 了
第一步自然是搜索有没有现成的, 运气不错, 找到了大佬的示例
本篇参考了 https://juejin.im/post/5d831333f265da03c61e8a28 的内容, 但因为我是 macOS, 所以进行了一些修改 包括有的东西设置后发现没生效, 在实际打包的时候会报类似下面的这种错误
1ld: warning: building for macOS, but linking in object file (libswresample/libswresample.a(resample.o)) built for free standing
所以我根据实际的报错内容进行了修改
编译脚本
这里只需要修改你的 NDK 为你本地的 NDK 目录即可
最新的代码在这里: https://gist.github.com/CaiJingLong/feefa3b63e5b94f5ad1807825861e0e0 gist.github.com 需要自备梯子
1#!/bin/bash
2
3NDK=/Volumes/Evo512/sdk/android-ndk-r20
4TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64
5API=21
6
7function build_android
8{
9echo "Compiling FFmpeg for $CPU"
10./configure \
11 --prefix=$PREFIX \
12 --libdir=$LIB_DIR \
13 --enable-shared \
14 --disable-static \
15 --enable-jni \
16 --disable-doc \
17 --disable-symver \
18 --disable-programs \
19 --target-os=android \
20 --arch=$ARCH \
21 --cpu=$CPU \
22 --cc=$CC \
23 --cxx=$CXX \
24 --enable-cross-compile \
25 --sysroot=$SYSROOT \
26 --extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \
27 --extra-ldflags="$ADDI_LDFLAGS" \
28 --disable-asm \
29 $COMMON_FF_CFG_FLAGS
30make clean
31make -j8
32make install
33echo "The Compilation of FFmpeg for $CPU is completed"
34}
35
36# # armv8-a
37# source "config-env.sh"
38# OUTPUT_FOLDER="arm64-v8a"
39# ARCH=arm64
40# CPU="armv8-a"
41# TOOL_CPU_NAME=aarch64
42# TOOL_PREFIX="$TOOLCHAIN/bin/$TOOL_CPU_NAME-linux-android"
43
44# CC="$TOOL_PREFIX$API-clang"
45# CXX="$TOOL_PREFIX$API-clang++"
46# SYSROOT="$NDK/toolchains/llvm/prebuilt/darwin-x86_64/sysroot"
47# PREFIX="${PWD}/android/$OUTPUT_FOLDER"
48# LIB_DIR="${PWD}/android/libs/$OUTPUT_FOLDER"
49# OPTIMIZE_CFLAGS="-march=$CPU"
50# build_android
51
52# # armv7-a
53# source "config-env.sh"
54# OUTPUT_FOLDER="armeabi-v7a"
55# ARCH="arm"
56# CPU="armv7-a"
57# TOOL_CPU_NAME=armv7a
58# TOOL_PREFIX="$TOOLCHAIN/bin/arm-linux-androideabi"
59
60# CC="$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang"
61# CXX="$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++"
62# SYSROOT="$NDK/toolchains/llvm/prebuilt/darwin-x86_64/sysroot"
63# PREFIX="${PWD}/android/$OUTPUT_FOLDER"
64# LIB_DIR="${PWD}/android/libs/$OUTPUT_FOLDER"
65# OPTIMIZE_CFLAGS="-march=$CPU"
66# build_android
67
68# x86
69source "config-env.sh"
70OUTPUT_FOLDER="x86"
71ARCH="x86"
72CPU="x86"
73TOOL_CPU_NAME="i686"
74TOOL_PREFIX="$TOOLCHAIN/bin/${TOOL_CPU_NAME}-linux-android"
75
76CC="$TOOL_PREFIX$API-clang"
77CXX="$TOOL_PREFIX$API-clang++"
78SYSROOT="$NDK/toolchains/llvm/prebuilt/darwin-x86_64/sysroot"
79PREFIX="${PWD}/android/$OUTPUT_FOLDER"
80LIB_DIR="${PWD}/android/libs/$OUTPUT_FOLDER"
81OPTIMIZE_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"
82build_android
83
84# x86_64
85# source "config-env.sh"
86# OUTPUT_FOLDER="x86_64"
87# ARCH="x86_64"
88# CPU="x86-64"
89# TOOL_CPU_NAME="x86_64"
90# TOOL_PREFIX="$TOOLCHAIN/bin/${TOOL_CPU_NAME}-linux-android"
91
92# CC="$TOOL_PREFIX$API-clang"
93# CXX="$TOOL_PREFIX$API-clang++"
94# SYSROOT="$NDK/toolchains/llvm/prebuilt/darwin-x86_64/sysroot"
95# PREFIX="${PWD}/android/$OUTPUT_FOLDER"
96# LIB_DIR="${PWD}/android/libs/$OUTPUT_FOLDER"
97# OPTIMIZE_CFLAGS="-march=$CPU"
98# build_android
根据自己需要的 cpu, 放开对应的注释即可
config-env.sh
这个环境是 ijkplayer 的 ffmpeg 配置
1#! /usr/bin/env bash
2
3# shell/config.sh
4# 这个来自ijkplayer的ffmpeg配置, 会在上面的build脚本中被引入
5
6#--------------------
7# Standard options:
8export COMMON_FF_CFG_FLAGS=
9# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --prefix=PREFIX"
10
11# Licensing options:
12export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-gpl"
13# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-version3"
14export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-nonfree"
15
16# Configuration options:
17# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-static"
18# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-shared"
19# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-small"
20export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-runtime-cpudetect"
21export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-gray"
22export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-swscale-alpha"
23
24# Program options:
25export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-programs"
26export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-ffmpeg"
27export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-ffplay"
28export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-ffprobe"
29# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-ffserver"
30
31# Documentation options:
32export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-doc"
33export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-htmlpages"
34export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-manpages"
35export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-podpages"
36export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-txtpages"
37
38# Component options:
39export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-avdevice"
40export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-avcodec"
41export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-avformat"
42export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-avutil"
43export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-swresample"
44export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-swscale"
45export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-postproc"
46export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-avfilter"
47export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-avresample"
48# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-pthreads"
49# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-w32threads"
50# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-os2threads"
51export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-network"
52# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-dct"
53# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-dwt"
54# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-lsp"
55# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-lzo"
56# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-mdct"
57# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-rdft"
58# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-fft"
59
60# Hardware accelerators:
61export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-d3d11va"
62export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-dxva2"
63export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-vaapi"
64# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-vda"
65export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-vdpau"
66export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-videotoolbox"
67
68# Individual component options:
69# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-everything"
70export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-encoders"
71export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-encoder=png"
72
73# ./configure --list-decoders
74export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-decoders"
75export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=aac"
76export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=aac_latm"
77export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=flv"
78export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=h264"
79export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=mp3*"
80export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=vp6f"
81export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=flac"
82export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=hevc"
83export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=vp8"
84export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=vp9"
85export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=h263"
86export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=h263i"
87export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=h263p"
88export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=mpeg4"
89export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=mjpeg"
90
91export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-hwaccels"
92
93# ./configure --list-muxers
94export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-muxers"
95export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-muxer=mp4"
96
97# ./configure --list-demuxers
98export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-demuxers"
99export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=aac"
100export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=concat"
101export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=data"
102export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=flv"
103export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=hls"
104export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=live_flv"
105export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=mov"
106export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=mp3"
107export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=mpegps"
108export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=mpegts"
109export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=mpegvideo"
110export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=flac"
111export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=hevc"
112export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=webm_dash_manifest"
113export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=mpeg4"
114export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=rtsp"
115export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=mjpeg"
116export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=avi"
117
118# ./configure --list-parsers
119export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-parsers"
120export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-parser=aac"
121export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-parser=aac_latm"
122export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-parser=h264"
123export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-parser=flac"
124export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-parser=hevc"
125export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-parser=mpeg4"
126export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-parser=mpeg4video"
127export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-parser=mpegvideo"
128
129# ./configure --list-bsf
130export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-bsfs"
131export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=chomp"
132export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=dca_core"
133export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=dump_extradata"
134export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=hevc_mp4toannexb"
135export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=imx_dump_header"
136export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=mjpeg2jpeg"
137export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=mjpega_dump_header"
138export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=mov2textsub"
139export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=mp3_header_decompress"
140export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=mpeg4_unpack_bframes"
141export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=noise"
142export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=remove_extradata"
143export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=text2movsub"
144export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=vp9_superframe"
145
146# ./configure --list-protocols
147export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocols"
148export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=async"
149export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=bluray"
150export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=concat"
151export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=crypto"
152export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=ffrtmpcrypt"
153export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=ffrtmphttp"
154export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=gopher"
155export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=icecast"
156export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=librtmp*"
157export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=libssh"
158export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=md5"
159export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=mmsh"
160export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=mmst"
161export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=rtmp*"
162export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=rtmp"
163export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=rtmpt"
164export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=rtp"
165export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=sctp"
166export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=srtp"
167export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=subfile"
168export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=unix"
169
170#
171export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-devices"
172export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-filters"
173
174# External library support:
175export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-iconv"
176export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-audiotoolbox"
177export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-videotoolbox"
178
179# ...
180
181# Advanced options (experts only):
182# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --cross-prefix=${FF_CROSS_PREFIX}-"
183# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-cross-compile"
184# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --sysroot=PATH"
185# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --sysinclude=PATH"
186# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --target-os=TAGET_OS"
187# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --target-exec=CMD"
188# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --target-path=DIR"
189# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --toolchain=NAME"
190# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --nm=NM"
191# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --ar=AR"
192# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --as=AS"
193# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --yasmexe=EXE"
194# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --cc=CC"
195# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --cxx=CXX"
196# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --dep-cc=DEPCC"
197# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --ld=LD"
198# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --host-cc=HOSTCC"
199# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --host-cflags=HCFLAGS"
200# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --host-cppflags=HCPPFLAGS"
201# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --host-ld=HOSTLD"
202# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --host-ldflags=HLDFLAGS"
203# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --host-libs=HLIBS"
204# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --host-os=OS"
205# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --extra-cflags=ECFLAGS"
206# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --extra-cxxflags=ECFLAGS"
207# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --extra-ldflags=ELDFLAGS"
208# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --extra-libs=ELIBS"
209# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --extra-version=STRING"
210# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --optflags=OPTFLAGS"
211# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --build-suffix=SUFFIX"
212# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --malloc-prefix=PREFIX"
213# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --progs-suffix=SUFFIX"
214# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --arch=ARCH"
215# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --cpu=CPU"
216# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-pic"
217# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-sram"
218# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-thumb"
219# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-symver"
220# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-hardcoded-tables"
221# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-safe-bitstream-reader"
222# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-memalign-hack"
223# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-lto"
224
225# Optimization options (experts only):
226# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-asm"
227# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-altivec"
228# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-amd3dnow"
229# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-amd3dnowext"
230# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-mmx"
231# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-mmxext"
232# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-sse"
233# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-sse2"
234# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-sse3"
235# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-ssse3"
236# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-sse4"
237# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-sse42"
238# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-avx"
239# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-fma4"
240# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-armv5te"
241# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-armv6"
242# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-armv6t2"
243# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-vfp"
244# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-neon"
245# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-vis"
246# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-inline-asm"
247# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-yasm"
248# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-mips32r2"
249# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-mipsdspr1"
250# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-mipsdspr2"
251# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-mipsfpu"
252# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-fast-unaligned"
253
254# Developer options (useful when working on FFmpeg itself):
255# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-coverage"
256# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-debug"
257# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-debug=LEVEL"
258# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-optimizations"
259# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-extra-warnings"
260# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-stripping"
261# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --assert-level=level"
262# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-memory-poisoning"
263# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --valgrind=VALGRIND"
264# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-ftrapv"
265# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --samples=PATH"
266# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-xmm-clobber-test"
267# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-random"
268# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-random"
269# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-random=LIST"
270# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-random=LIST"
271# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --random-seed=VALUE"
272export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-linux-perf"
273export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bzlib"
修改脚本的执行权限:
$ chmod +x build_android.sh
$ ./build_android.sh
接着运行就可以了
pkg-config 是自动导出的内容, 不想要就删掉即可
ijkplayer 里的 ffmpeg 应该是打包成静态库, 然后通过合并等操作来变成一个 so 的, 这里就没拆开
android 中引入
有动态库, 理论上就可以在项目里跑了, 我们试试自己引入这些 so 和代码, 然后通过项目调用一下
复制文件到项目里 $ cp -r android/libs/* myproject/libs
完整 gradle 配置如下:
1apply plugin: 'com.android.application'
2
3apply plugin: 'kotlin-android'
4
5apply plugin: 'kotlin-android-extensions'
6
7android {
8 compileSdkVersion 29
9 buildToolsVersion "29.0.2"
10 defaultConfig {
11 applicationId "top.kikt.ffmpeg_sdl_example"
12 minSdkVersion 21
13 targetSdkVersion 29
14 versionCode 1
15 versionName "1.0"
16 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
17 externalNativeBuild {
18 cmake {
19 cppFlags "" // cpp编译时的参数配置
20 }
21 }
22 ndk {
23 abiFilters 'arm64-v8a', 'armeabi-v7a', 'x86', 'x86_64' // cpu类型
24 }
25 }
26 buildTypes {
27 release {
28 minifyEnabled false
29 proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
30 }
31 }
32 externalNativeBuild {
33 cmake {
34 path "src/main/cpp/CMakeLists.txt" // cmake 文件配置
35 version "3.10.2"
36 }
37 }
38 compileOptions {
39 sourceCompatibility = 1.8
40 targetCompatibility = 1.8
41 }
42
43 sourceSets {
44 main {
45 jniLibs.srcDirs = ['libs'] // so库的父目录指定
46 }
47 }
48}
49
50dependencies {
51 implementation fileTree(dir: 'libs', include: ['*.jar'])
52 implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
53 implementation 'androidx.appcompat:appcompat:1.1.0'
54 implementation 'androidx.core:core-ktx:1.1.0'
55 implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
56 testImplementation 'junit:junit:4.12'
57 androidTestImplementation 'androidx.test.ext:junit:1.1.1'
58 androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
59}
1cmake_minimum_required(VERSION 3.4.1) # cmake版本
2
3include_directories(include)
4
5add_library(
6 ffmpeg-bridge # 自己库的名称
7
8 SHARED # 库的类型, 静态/动态
9
10 ffmpeg-bridge.cpp) # 库的源码
11
12
13file(GLOB FFMPEG_LIBS ../../../libs/${CMAKE_ANDROID_ARCH_ABI}/*.so) # 这里是找到对应的CPU
14message("ffmpeg libs : ${FFMPEG_LIBS}") # app/.cxx/cmake/debug/arm64-v8a/build_output.txt 这里可以看到日志
15
16find_library(
17 log-lib
18 log)
19
20target_link_libraries( # Specifies the target library.
21 ffmpeg-bridge
22 ${log-lib}
23 ${FFMPEG_LIBS}
24 )
ffmpeg-bridge.cpp:
1#include <jni.h>
2#include <string>
3#include <android/log.h>
4
5#ifdef __cplusplus
6#if __cplusplus
7extern "C" {
8#endif
9#endif
10#include <libavutil/avutil.h>
11#include <libavformat/avformat.h>
12#ifdef __cplusplus
13#if __cplusplus
14}
15#endif
16#endif
17
18extern "C" void logToAndroid(void *ptr, int level, const char *fmt, va_list vl) {
19 if (level == AV_LOG_INFO) {
20 __android_log_vprint(ANDROID_LOG_INFO, "ffmpeg", fmt, vl);
21 } else if (level == AV_LOG_DEBUG) {
22 __android_log_vprint(ANDROID_LOG_DEBUG, "ffmpeg", fmt, vl);
23 }
24}
25
26extern "C" JNIEXPORT jstring JNICALL
27Java_top_kikt_ffmpeg_1sdl_1example_MainActivity_stringFromJNI(
28 JNIEnv *env,
29 jobject /* this */) {
30 std::string hello = "Hello from C++";
31 return env->NewStringUTF(hello.c_str());
32}
33
34extern "C"
35JNIEXPORT void JNICALL
36Java_top_kikt_ffmpeg_1sdl_1example_FFmpeg_dumpInfo(JNIEnv *env, jclass clazz, jstring url) { // 这个是映射的Java native方法, 具体的含义可以用搜索引擎搜javah相关的东西, 这里就不细说了
37 av_log_set_callback(logToAndroid);
38 AVFormatContext *context = nullptr;
39
40 const char *cUrl = (*env).GetStringUTFChars(url, nullptr);
41
42 avformat_open_input(&context, cUrl, nullptr, nullptr);
43
44 av_dump_format(context, -1, cUrl, 0);
45
46 if (context) {
47 avformat_close_input(&context);
48 }
49}
1package top.kikt.ffmpeg_sdl_example;
2
3public class FFmpeg {
4
5 static {
6 System.loadLibrary("ffmpeg-bridge"); // 引入so库, 至于其他的库, 因为在cmake里配置link了, 我实测不需要单独引入
7 }
8
9 public static native void dumpInfo(String url); // 映射到ffmpeg-bridge中的对应方法
10
11}
接着在项目里调用就可以像是调用 ffmpeg 中的 av_dump_format
方法一样了
这里还要说明一下, 在 c/cpp 端还有一种是用函数指针的方式来映射方法, 可以
参考 ijkplayer
中的 ijkplayer_jni.c
这种方法在方法声明时不需要遵循那个包名_类名_方法名
的命名方式, 但是需要定义一些其他的东西, 这个可以百度搜索一下具体的定义规则, 这里就顺便说一下而已
1package top.kikt.ffmpeg_sdl_example
2
3import android.os.Bundle
4import android.util.Log
5import androidx.appcompat.app.AppCompatActivity
6import kotlinx.android.synthetic.main.activity_main.*
7import java.io.File
8
9class MainActivity : AppCompatActivity() {
10
11 override fun onCreate(savedInstanceState: Bundle?) {
12 super.onCreate(savedInstanceState)
13 setContentView(R.layout.activity_main)
14
15 sample_button.setOnClickListener {
16 FFmpeg.dumpInfo("http://media.w3.org/2010/05/sintel/trailer.mp4") // 这里因为没有在异步线程调用, 所以会卡UI, 忽略即可😁
17 }
18
19 }
20}
这个也很简单, 就是 dump 一个信息, xml 可以看项目源码
demo 里用的是另一个方法, 就是抽取视频的首帧, 转为 jpg 格式, 存在文件里
然后我发现了, 我找了网上的 5 个视频来做这个尝试, 只有一个视频首帧不是黑屏 真不知道播放器的库里 issue 为啥一个个都要求用首帧来做封面, 然后吧解释过自己传一个好看的封面才是正道也不听, 还自认为是刚需
后记
因为偷懒, 提取首帧为 jpeg 图片的 so 库只有 x86 有, 也就是仅支持模拟器端, 其他的 cpu 类型没加 mjpeg 的编码器和封装器
https://github.com/CaiJingLong/android_compile_ffmpeg4_example.git
现在还没做 OpenSSL 关联, 所以 https tls 之类的都没法用
以上