Skip to content

Commit 9609a17

Browse files
committed
support compile ffmpeg for android
1 parent 4ff32c5 commit 9609a17

32 files changed

Lines changed: 558 additions & 240 deletions
Lines changed: 196 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,196 @@
1+
#! /usr/bin/env bash
2+
#
3+
# Copyright (C) 2021 Matt Reach<qianlongxu@gmail.com>
4+
5+
# Licensed under the Apache License, Version 2.0 (the "License");
6+
# you may not use this file except in compliance with the License.
7+
# You may obtain a copy of the License at
8+
#
9+
# http://www.apache.org/licenses/LICENSE-2.0
10+
#
11+
# Unless required by applicable law or agreed to in writing, software
12+
# distributed under the License is distributed on an "AS IS" BASIS,
13+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
# See the License for the specific language governing permissions and
15+
# limitations under the License.
16+
#
17+
18+
# https://ffmpeg.org/doxygen/4.1/md_LICENSE.html
19+
# https://www.openssl.org/source/license.html
20+
21+
# pkg-config --variable pc_path pkg-config
22+
# pkg-config --libs dav1d
23+
# pkg-config --cflags --libs libbluray
24+
25+
THIRD_CFG_FLAGS=
26+
27+
echo "----------------------"
28+
29+
pkg-config --libs x264 --silence-errors >/dev/null && enable_x264=1
30+
31+
if [[ $enable_x264 ]];then
32+
echo "[✅] --enable-libx264"
33+
THIRD_CFG_FLAGS="$THIRD_CFG_FLAGS --enable-gpl --enable-libx264"
34+
else
35+
echo "[❌] --disable-libx264"
36+
fi
37+
38+
echo "----------------------"
39+
40+
pkg-config --libs fdk-aac --silence-errors >/dev/null && enable_aac=1
41+
42+
if [[ $enable_aac ]];then
43+
echo "[✅] --enable-libfdk-aac"
44+
THIRD_CFG_FLAGS="$THIRD_CFG_FLAGS --enable-nonfree --enable-libfdk-aac"
45+
else
46+
echo "[❌] --disable-libfdk-aac"
47+
fi
48+
49+
echo "----------------------"
50+
51+
pkg-config --libs mp3lame --silence-errors >/dev/null && enable_lame=1
52+
53+
if [[ $enable_lame ]];then
54+
echo "[✅] --enable-libmp3lame"
55+
THIRD_CFG_FLAGS="$THIRD_CFG_FLAGS --enable-gpl --enable-libmp3lame"
56+
else
57+
echo "[❌] --disable-libmp3lame"
58+
fi
59+
60+
echo "----------------------"
61+
# use pkg-config fix ff4.0--ijk0.8.8--20210426--001 use openssl 1_1_1m occur can't find openssl error.
62+
63+
pkg-config --libs openssl --silence-errors >/dev/null && enable_openssl=1
64+
65+
if [[ $enable_openssl ]];then
66+
echo "[✅] --enable-openssl"
67+
THIRD_CFG_FLAGS="$THIRD_CFG_FLAGS --enable-nonfree --enable-openssl"
68+
else
69+
echo "[❌] --disable-openssl"
70+
fi
71+
72+
echo "----------------------"
73+
74+
pkg-config --libs opus --silence-errors >/dev/null && enable_opus=1
75+
76+
if [[ $enable_opus ]];then
77+
echo "[✅] --enable-libopus"
78+
THIRD_CFG_FLAGS="$THIRD_CFG_FLAGS --enable-libopus --enable-decoder=opus"
79+
else
80+
echo "[❌] --disable-libopus"
81+
fi
82+
83+
echo "----------------------"
84+
# FFmpeg 4.2 支持AV1、AVS2等格式
85+
# dav1d由VideoLAN,VLC和FFmpeg联合开发,项目由AOM联盟赞助,和libaom相比,dav1d性能普遍提升100%,最高提升400%
86+
#just wait videotoolbox support decode av1
87+
# THIRD_CFG_FLAGS="$THIRD_CFG_FLAGS --enable-decoder=av1"
88+
89+
pkg-config --libs dav1d --silence-errors >/dev/null && enable_dav1d=1
90+
91+
if [[ $enable_dav1d ]];then
92+
echo "[✅] --enable-libdav1d"
93+
THIRD_CFG_FLAGS="$THIRD_CFG_FLAGS --enable-libdav1d --enable-decoder=libdav1d"
94+
else
95+
echo "[❌] --disable-libdav1d"
96+
fi
97+
98+
echo "----------------------"
99+
100+
pkg-config --libs libsmb2 --silence-errors >/dev/null && enable_smb2=1
101+
102+
if [[ $enable_smb2 ]];then
103+
echo "[✅] --enable-libsmb2"
104+
THIRD_CFG_FLAGS="$THIRD_CFG_FLAGS --enable-libsmb2 --enable-protocol=libsmb2"
105+
else
106+
echo "[❌] --disable-libsmb2"
107+
fi
108+
109+
echo "----------------------"
110+
111+
pkg-config --libs libbluray --silence-errors >/dev/null && enable_bluray=1
112+
113+
if [[ $enable_bluray ]];then
114+
echo "[✅] --enable-libbluray"
115+
THIRD_CFG_FLAGS="$THIRD_CFG_FLAGS --enable-libbluray --enable-protocol=bluray"
116+
else
117+
echo "[❌] --disable-libbluray"
118+
fi
119+
echo "----------------------"
120+
121+
pkg-config --libs dvdread --silence-errors >/dev/null && enable_dvdread=1
122+
123+
if [[ $enable_dvdread ]];then
124+
echo "[✅] --enable-libdvdread"
125+
THIRD_CFG_FLAGS="$THIRD_CFG_FLAGS --enable-libdvdread --enable-protocol=dvd"
126+
else
127+
echo "[❌] --disable-libdvdread"
128+
fi
129+
130+
echo "----------------------"
131+
132+
pkg-config --libs uavs3d --silence-errors >/dev/null && enable_uavs3d=1
133+
134+
if [[ $enable_uavs3d ]];then
135+
echo "[✅] --enable-libuavs3d"
136+
THIRD_CFG_FLAGS="$THIRD_CFG_FLAGS --enable-libuavs3d --enable-decoder=libuavs3d"
137+
else
138+
echo "[❌] --disable-libuavs3d"
139+
fi
140+
141+
echo "----------------------"
142+
143+
# pkg-config --libs avs3ad --silence-errors >/dev/null && enable_avs3ad=1
144+
145+
# if [[ $enable_avs3ad ]];then
146+
# echo "[✅] --enable-decoder=av3a"
147+
# THIRD_CFG_FLAGS="$THIRD_CFG_FLAGS --enable-parser=av3a"
148+
# else
149+
# echo "[❌] --disable-decoder=av3a"
150+
# fi
151+
152+
# echo "[✅] --enable-parser=av3a"
153+
# THIRD_CFG_FLAGS="$THIRD_CFG_FLAGS --enable-parser=av3a --enable-demuxer=av3a"
154+
155+
156+
# --------------------------------------------------------------
157+
158+
THIRD_CFG_FLAGS="$THIRD_CFG_FLAGS --pkg-config-flags=--static"
159+
THIRD_CFG_FLAGS="$THIRD_CFG_FLAGS --enable-static"
160+
THIRD_CFG_FLAGS="$THIRD_CFG_FLAGS --disable-shared"
161+
162+
THIRD_CFG_FLAGS="--prefix=$MR_BUILD_PREFIX $THIRD_CFG_FLAGS"
163+
164+
# Developer options (useful when working on FFmpeg itself):
165+
# THIRD_CFG_FLAGS="$THIRD_CFG_FLAGS --disable-stripping"
166+
167+
##
168+
THIRD_CFG_FLAGS="$THIRD_CFG_FLAGS --arch=$MR_FF_ARCH"
169+
THIRD_CFG_FLAGS="$THIRD_CFG_FLAGS --target-os=$MR_TAGET_OS"
170+
171+
# x86_64, arm64
172+
THIRD_CFG_FLAGS="$THIRD_CFG_FLAGS --enable-pic"
173+
THIRD_CFG_FLAGS="$THIRD_CFG_FLAGS --enable-neon"
174+
THIRD_CFG_FLAGS="$THIRD_CFG_FLAGS --enable-asm"
175+
176+
if [[ "$MR_DEBUG" == "debug" ]]; then
177+
THIRD_CFG_FLAGS="$THIRD_CFG_FLAGS --disable-optimizations"
178+
THIRD_CFG_FLAGS="$THIRD_CFG_FLAGS --enable-debug"
179+
THIRD_CFG_FLAGS="$THIRD_CFG_FLAGS --disable-small"
180+
#C_FLAGS="$C_FLAGS -D DEBUG_BLURAY=1"
181+
else
182+
THIRD_CFG_FLAGS="$THIRD_CFG_FLAGS --enable-optimizations"
183+
THIRD_CFG_FLAGS="$THIRD_CFG_FLAGS --disable-debug"
184+
THIRD_CFG_FLAGS="$THIRD_CFG_FLAGS --enable-small"
185+
fi
186+
187+
# for apple paltform
188+
189+
case "$MR_PLAT" in
190+
ios|macos|tvos)
191+
# enable videotoolbox hwaccel
192+
CFG_FLAGS="$CFG_FLAGS --enable-videotoolbox"
193+
CFG_FLAGS="$CFG_FLAGS --enable-hwaccel=*_videotoolbox"
194+
;;
195+
esac
196+

configs/ffconfig/module-full.sh

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,6 @@ export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=mpegts"
369369
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=mpegvideo"
370370
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=hevc"
371371
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=h264"
372-
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=dash --enable-libxml2"
373372
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=webm_dash_manifest"
374373
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=avi"
375374
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=rm"
@@ -451,9 +450,7 @@ export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-iconv"
451450
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-audiotoolbox"
452451
# hw accels
453452
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-hwaccels"
454-
# enable videotoolbox hwaccel
455-
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-videotoolbox"
456-
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-hwaccel=*_videotoolbox"
453+
457454
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-sdl2"
458455

459456
# enable ffplay

do-compile/android/any.sh

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,6 @@ function do_compile() {
6767
}
6868

6969
function do_clean() {
70-
init_arch_env $1 >/dev/null
7170

7271
if [[ -d $MR_BUILD_SOURCE ]];then
7372
echo "git clean:$MR_BUILD_SOURCE"
@@ -89,6 +88,8 @@ function main() {
8988
case "$cmd" in
9089
'clean')
9190
for arch in $MR_ACTIVE_ARCHS; do
91+
export _MR_ARCH=$arch
92+
source $MR_SHELL_TOOLS_DIR/export-android-build-env.sh
9293
do_clean $arch
9394
done
9495

@@ -101,16 +102,18 @@ function main() {
101102
'build')
102103
for arch in $MR_ACTIVE_ARCHS; do
103104
export _MR_ARCH=$arch
104-
source $THIS_DIR/../../tools/export-android-build-env.sh
105+
source $MR_SHELL_TOOLS_DIR/export-android-build-env.sh
105106
do_compile
106107
echo
107108
done
108109
do_lipo_all "$MR_ACTIVE_ARCHS"
109110
;;
110111
'rebuild')
112+
echo
111113
echo '---clean for rebuild-----------------'
112114
MR_CMD='clean'
113115
main #>/dev/null
116+
echo
114117
echo '---build for rebuild-----------------'
115118
MR_CMD='build'
116119
main

do-compile/android/ffmpeg.sh

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
#! /usr/bin/env bash
2+
#
3+
# Copyright (C) 2021 Matt Reach<qianlongxu@gmail.com>
4+
5+
# Licensed under the Apache License, Version 2.0 (the "License");
6+
# you may not use this file except in compliance with the License.
7+
# You may obtain a copy of the License at
8+
#
9+
# http://www.apache.org/licenses/LICENSE-2.0
10+
#
11+
# Unless required by applicable law or agreed to in writing, software
12+
# distributed under the License is distributed on an "AS IS" BASIS,
13+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
# See the License for the specific language governing permissions and
15+
# limitations under the License.
16+
#
17+
18+
# This script is based on projects below
19+
# https://github.com/bilibili/ijkplayer
20+
21+
set -e
22+
23+
error_handler() {
24+
echo "An error occurred!"
25+
tail -n20 ${MR_BUILD_SOURCE}/ffbuild/config.log
26+
}
27+
28+
trap 'error_handler' ERR
29+
30+
THIS_DIR=$(DIRNAME=$(dirname "$0"); cd "$DIRNAME"; pwd)
31+
cd "$THIS_DIR"
32+
33+
# ffmpeg config options
34+
source $THIS_DIR/../../configs/ffconfig/module.sh
35+
source $THIS_DIR/../../configs/ffconfig/auto-detect-third-libs.sh
36+
37+
CFG_FLAGS="$COMMON_FF_CFG_FLAGS"
38+
CFG_FLAGS="$CFG_FLAGS $THIRD_CFG_FLAGS"
39+
40+
# for cross compile
41+
if [[ $(uname -m) != "$MR_ARCH" || "$MR_FORCE_CROSS" ]]; then
42+
echo "[*] cross compile, on $(uname -m) compile $MR_PLAT $MR_ARCH."
43+
# https://www.gnu.org/software/automake/manual/html_node/Cross_002dCompilation.html
44+
CFG_FLAGS="$CFG_FLAGS --sysroot=$MR_SYS_ROOT"
45+
CFG_FLAGS="$CFG_FLAGS --enable-cross-compile"
46+
fi
47+
48+
49+
# Android 15 with 16 kb page size support
50+
# https://developer.android.com/guide/practices/page-sizes#compile-r27
51+
EXTRA_LDFLAGS="-Wl,-z,max-page-size=16384"
52+
53+
54+
C_FLAGS="$MR_OTHER_CFLAGS"
55+
LDFLAGS=$EXTRA_LDFLAGS
56+
57+
58+
echo "----------------------"
59+
echo "[*] configure"
60+
61+
if [[ ! -d $MR_BUILD_SOURCE ]]; then
62+
echo ""
63+
echo "!! ERROR"
64+
echo "!! Can not find $MR_BUILD_SOURCE directory for $MR_BUILD_NAME"
65+
echo "!! Run 'init-*.sh' first"
66+
echo ""
67+
exit 1
68+
fi
69+
70+
cd $MR_BUILD_SOURCE
71+
72+
if [[ -f "./config.h" ]]; then
73+
echo 'reuse configure'
74+
else
75+
76+
echo
77+
echo "CC: ${MR_TRIPLE_CC}"
78+
echo
79+
echo "CFLAGS: $C_FLAGS"
80+
echo
81+
echo "LDFLAGS:$LDFLAGS"
82+
echo
83+
echo "FF_CFG_FLAGS: $CFG_FLAGS"
84+
echo
85+
86+
./configure \
87+
$CFG_FLAGS \
88+
--cc=${MR_TRIPLE_CC} \
89+
--ld=${MR_TRIPLE_CC} \
90+
--as=${MR_TRIPLE_CC} \
91+
--ar=${MR_AR} \
92+
--nm=${MR_NM} \
93+
--strip=${MR_STRIP} \
94+
--ranlib=${MR_RANLIB} \
95+
--extra-cflags="$C_FLAGS" \
96+
--extra-cxxflags="$C_FLAGS" \
97+
--extra-ldflags="$LDFLAGS" \
98+
--pkg-config=${MR_PKG_CONFIG_EXECUTABLE}
99+
fi
100+
101+
#----------------------
102+
echo "----------------------"
103+
echo "[*] compile"
104+
105+
make -j$MR_HOST_NPROC >/dev/null
106+
107+
echo "----------------------"
108+
echo "[*] install"
109+
110+
cp config.* $MR_BUILD_PREFIX
111+
make install >/dev/null
112+
mkdir -p $MR_BUILD_PREFIX/include/libffmpeg
113+
cp -f config.h $MR_BUILD_PREFIX/include/libffmpeg/
114+
cp -f config_components.h $MR_BUILD_PREFIX/include/libffmpeg/
115+
# copy private header for ffmpeg-kit.
116+
cp -f $MR_BUILD_SOURCE/libavutil/getenv_utf8.h $MR_BUILD_PREFIX/include/libavutil/
117+
cp -f $MR_BUILD_SOURCE/libavutil/internal.h $MR_BUILD_PREFIX/include/libavutil/
118+
cp -f $MR_BUILD_SOURCE/libavutil/libm.h $MR_BUILD_PREFIX/include/libavutil/
119+
cp -f $MR_BUILD_SOURCE/libavutil/attributes_internal.h $MR_BUILD_PREFIX/include/libavutil/
120+
cp -f $MR_BUILD_SOURCE/libavcodec/mathops.h $MR_BUILD_PREFIX/include/libavcodec/
121+
122+
mkdir -p $MR_BUILD_PREFIX/include/libavcodec/x86/
123+
cp -f $MR_BUILD_SOURCE/libavcodec/x86/mathops.h $MR_BUILD_PREFIX/include/libavcodec/x86/
124+
mkdir -p $MR_BUILD_PREFIX/include/libavutil/x86/
125+
cp -f $MR_BUILD_SOURCE/libavutil/x86/asm.h $MR_BUILD_PREFIX/include/libavutil/x86/

do-compile/android/main.sh

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,10 @@ do
3131
echo "===[$MR_CMD $lib]===================="
3232
source "../../configs/libs/${lib}.sh"
3333

34-
echo "LIB_NAME : [$LIB_NAME]"
35-
echo "LIPO_LIBS : [$LIPO_LIBS]"
36-
echo "GIT_COMMIT : [$GIT_COMMIT]"
37-
echo "GIT_REPO_VERSION: [$GIT_REPO_VERSION]"
34+
echo "LIB_NAME : [$LIB_NAME]"
35+
echo "GIT_COMMIT : [$GIT_COMMIT]"
3836
echo "PRE_COMPILE_TAG : [$PRE_COMPILE_TAG]"
37+
echo "LIPO_LIBS : [$LIPO_LIBS]"
3938
echo "GIT_UPSTREAM : [$GIT_UPSTREAM]"
4039

4140
./any.sh

0 commit comments

Comments
 (0)