Android 记录在macOS上使用 NDK20 编译ffmpeg4.2.2的过程

文章目录

前言

ijkplayer 的 ffmpeg 是旧版本的, ndk 也是旧的, 程序员爱折腾, 所以想用最新的 ndk 编译最新的 ffmpeg, 当前就是 ndk20+ffmpeg4.2.2 了

第一步自然是搜索有没有现成的, 运气不错, 找到了大佬的示例

本篇参考了 的内容, 但因为我是 macOS, 所以进行了一些修改 包括有的东西设置后发现没生效, 在实际打包的时候会报类似下面的这种错误

1ld: warning: building for macOS, but linking in object file (libswresample/libswresample.a(resample.o)) built for free standing

所以我根据实际的报错内容进行了修改

编译脚本

这里只需要修改你的 NDK 为你本地的 NDK 目录即可

最新的代码在这里: 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

接着运行就可以了

20200107170946.png

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 端还有一种是用函数指针的方式来映射方法, 可以

这种方法在方法声明时不需要遵循那个包名_类名_方法名的命名方式, 但是需要定义一些其他的东西, 这个可以百度搜索一下具体的定义规则, 这里就顺便说一下而已

 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 的编码器和封装器

现在还没做 OpenSSL 关联, 所以 https tls 之类的都没法用

以上