源码下载编译,脚本里除去源码下载部分,编译部分如下
./init-android.sh
cd android/contrib
./compile-ffmpeg.sh clean
./compile-ffmpeg.sh all
cd ..
./compile-ijk.sh all
这里想知道init-android.sh、compile-ffmpeg.sh、compile-ijk.sh都干了啥。
1. init-android.sh
主要做了3件事
1. clone ffmpeg,并在android/contrib/目录下创建多份ffmpeg源码(根据架构"armv5"、"armv7a"、"arm64"、"x86"、"x86_64")
2. 准备ffmpeg config参数
3. 准备libyuv以及soundtouch源码
1.1 clone ffmpeg
这里涉及两个工具,为方便弄懂init-android.sh, 我先说明下他们的大概用途,具体脚本我会附在后边。
tools/pull-repo-base.sh:从远程git服务器拉取更新代码工具
tools/pull-repo-ref.sh:加快clone同一个项目到新目录
# IJK_FFMPEG_UPSTREAM=git://git.videolan.org/ffmpeg.git
IJK_FFMPEG_UPSTREAM=https://github.com/Bilibili/FFmpeg.git
IJK_FFMPEG_FORK=https://github.com/Bilibili/FFmpeg.git
IJK_FFMPEG_COMMIT=ff4.0--ijk0.8.8--20201130--001
IJK_FFMPEG_LOCAL_REPO=extra/ffmpeg
set -e
TOOLS=tools
git --version
echo "== pull ffmpeg base =="
sh $TOOLS/pull-repo-base.sh $IJK_FFMPEG_UPSTREAM $IJK_FFMPEG_LOCAL_REPO
function pull_fork()
{
echo "== pull ffmpeg fork $1 =="
sh $TOOLS/pull-repo-ref.sh $IJK_FFMPEG_FORK android/contrib/ffmpeg-$1 ${IJK_FFMPEG_LOCAL_REPO}
cd android/contrib/ffmpeg-$1
git checkout ${IJK_FFMPEG_COMMIT} -B ijkplayer
cd -
}
#1. clone ffmpeg,并在android/contrib/目录下创建多份ffmpeg源码
#根据架构"armv5"、"armv7a"、"arm64"、"x86"、"x86_64"
pull_fork "armv5"
pull_fork "armv7a"
pull_fork "arm64"
pull_fork "x86"
pull_fork "x86_64"
#2. 准备ffmpeg config参数
./init-config.sh
#3. 准备libyuv以及soundtouch源码
./init-android-libyuv.sh
./init-android-soundtouch.sh
涉及的两个工具脚本:
#tools/pull-repo-base.sh
#! /usr/bin/env bash
REMOTE_REPO=$1
LOCAL_WORKSPACE=$2
#判断$1或者$2为空 报错
#如果$2存在,拉取远程最新代码
if [ -z $REMOTE_REPO -o -z $LOCAL_WORKSPACE ]; then
echo "invalid call pull-repo.sh '$REMOTE_REPO' '$LOCAL_WORKSPACE'"
elif [ ! -d $LOCAL_WORKSPACE ]; then
git clone $REMOTE_REPO $LOCAL_WORKSPACE
else
cd $LOCAL_WORKSPACE
git fetch --all --tags
cd -
fi
#tools/pull-repo-ref.sh
#! /usr/bin/env bash
REMOTE_REPO=$1
LOCAL_WORKSPACE=$2
REF_REPO=$3
# $1 $2 $3不能为空
# --reference加快克隆速度,如果本地有从本地clone
# 如果工程存在,则拉取最新代码
if [ -z $1 -o -z $2 -o -z $3 ]; then
echo "invalid call pull-repo.sh '$1' '$2' '$3'"
elif [ ! -d $LOCAL_WORKSPACE ]; then
git clone --reference $REF_REPO $REMOTE_REPO $LOCAL_WORKSPACE
cd $LOCAL_WORKSPACE
git repack -a
else
cd $LOCAL_WORKSPACE
git fetch --all --tags
cd -
fi
1.2 准备ffmpeg config参数
init-config.sh:module.sh存储了ffmpeg configure相关的配置,这个后面编译ffmpeg时候会用到
if [ ! -f 'config/module.sh' ]; then
cp config/module-lite.sh config/module.sh
fi
1.3 准备libyuv以及soundtouch源码
init-android-libyuv.sh:拉取最新代码到本地REPO
再从本地REPO更新到ijkmedia/ijkyuv目录
这里有两层概念,一层是缓存层,负责与远程服务器同步,一层是本地依赖的源码,是适配不同的tag,可自由切换到脚本想要的提交
IJK_LIBYUV_UPSTREAM=https://github.com/Bilibili/libyuv.git
IJK_LIBYUV_FORK=https://github.com/Bilibili/libyuv.git
IJK_LIBYUV_COMMIT=ijk-r0.2.1-dev
IJK_LIBYUV_LOCAL_REPO=extra/libyuv
set -e
TOOLS=tools
echo "== pull libyuv base =="
sh $TOOLS/pull-repo-base.sh $IJK_LIBYUV_UPSTREAM $IJK_LIBYUV_LOCAL_REPO
echo "== pull libyuv fork =="
sh $TOOLS/pull-repo-ref.sh $IJK_LIBYUV_FORK ijkmedia/ijkyuv ${IJK_LIBYUV_LOCAL_REPO}
cd ijkmedia/ijkyuv
git checkout ${IJK_LIBYUV_COMMIT}
cd -
init-android-soundtouch.sh与init-android-libyuv.sh雷同,不再粘代码了。
2. android/contrib/compile-ffmpeg.sh
编译各个架构的ffmpeg,这里面脚本写的很多,主要功能就是编译各个架构的ffmpeg。这里不需要细看,不过我也把代码粘过来了,大概看下就行了。网上编译ffmpeg的脚本很多,可借鉴学习下。
#----------
UNI_BUILD_ROOT=`pwd`
FF_TARGET=$1
FF_TARGET_EXTRA=$2
set -e
set +x
FF_ACT_ARCHS_32="armv5 armv7a x86"
FF_ACT_ARCHS_64="armv5 armv7a arm64 x86 x86_64"
FF_ACT_ARCHS_ALL=$FF_ACT_ARCHS_64
#打印支持的所有架构,和当前所编译的所有架构
echo_archs() {
echo "===================="
echo "[*] check archs"
echo "===================="
echo "FF_ALL_ARCHS = $FF_ACT_ARCHS_ALL"
echo "FF_ACT_ARCHS = $*"
echo ""
}
echo_usage() {
echo "Usage:"
echo " compile-ffmpeg.sh armv5|armv7a|arm64|x86|x86_64"
echo " compile-ffmpeg.sh all|all32"
echo " compile-ffmpeg.sh all64"
echo " compile-ffmpeg.sh clean"
echo " compile-ffmpeg.sh check"
exit 1
}
echo_nextstep_help() {
echo ""
echo "--------------------"
echo "[*] Finished"
echo "--------------------"
echo "# to continue to build ijkplayer, run script below,"
echo "sh compile-ijk.sh "
}
#----------
case "$FF_TARGET" in
"")
echo_archs armv7a
sh tools/do-compile-ffmpeg.sh armv7a
;;
armv5|armv7a|arm64|x86|x86_64)
echo_archs $FF_TARGET $FF_TARGET_EXTRA
sh tools/do-compil