前言
集成ijkplayer
,需要執(zhí)行腳本init-ios.sh
掌实,那么init-ios.sh
腳本干嘛用的了,花了半天時(shí)間,學(xué)習(xí)了下shell腳本邦马,感覺(jué)腳本語(yǔ)言學(xué)起來(lái)還是比較容易上手的贱鼻,現(xiàn)在僅僅能看懂了,但是要自己寫(xiě)滋将,還需要花點(diǎn)時(shí)間邻悬,下面就拿腳本文件練練手,不知道理解的對(duì)不對(duì)随闽,還希望多交流.
后續(xù)會(huì)持續(xù)發(fā)布父丰,教你從零開(kāi)始搭建一個(gè)完整的iOS直播app
,希望能幫助到更多的人更快的了解直播掘宪。
如果喜歡我的文章蛾扇,可以關(guān)注我微博:袁崢Seemygo
ijkplayer集成官方說(shuō)明
下載ijkplayer,查看init-ios.sh文件
- 去到B站得github主頁(yè)魏滚,找到ijkplayer項(xiàng)目镀首,下載源碼 ijkplayer下載地址
- init-ios.sh目錄
一、了解shell基本語(yǔ)法
# ***********shell基本語(yǔ)法***********
# 1. # : 注釋
# 2. 定義變量 a = 3
# 3. $a : 獲取變量a => $a = 3
# 4. 條件語(yǔ)句 if 條件 then 執(zhí)行語(yǔ)句 fi栏赴,滿(mǎn)足條件 就會(huì)than后面的執(zhí)行語(yǔ)句
# 5. set -e 任何語(yǔ)句的執(zhí)行結(jié)果不是true則應(yīng)該退出蘑斧。這樣的好處是防止錯(cuò)誤像滾雪球般變大導(dǎo)致一個(gè)致命的錯(cuò)誤,而這些錯(cuò)誤本應(yīng)該在之前就被處理掉
# 6. 函數(shù)定義 function 函數(shù)名()
# 7. echo 打印
# 8. sh: 執(zhí)行腳本文件 sh a.sh =》 執(zhí)行腳本文件a.sh
# 9. $1:獲取參數(shù)第一個(gè)參數(shù)
# 10.$*:獲取參數(shù)所有參數(shù)
# 11.case:邏輯分支語(yǔ)句
case 值 in
條件1)command1 ;;
*)command2 ;;
esac
值等于條件1须眷,就會(huì)執(zhí)行command1竖瘾,否則不執(zhí)行,不滿(mǎn)足,就會(huì)執(zhí)行command2
* : 表示當(dāng)使用前面的各種模式均無(wú)法匹配該變量時(shí)花颗,將執(zhí)行*后的命令
# 12.for:循環(huán)語(yǔ)句
for var in item1 item2 ... itemN
do
command1
done
遍歷in后邊的變量捕传,一個(gè)一個(gè)給var賦值,在執(zhí)行command1
# 13.cd - : 回到上一級(jí)目錄
# 14.腳本開(kāi)頭 #!/usr/bin/env作用 : 在linux的一些bash的腳本,需在開(kāi)頭一行指定腳本的解釋程序,如: #!/usr/bin/env
# 15.-z 字符串 : 沒(méi)有字符串就為真
# 16.-o : 或
# 17.! : 非
# 18.-d : 是目錄就為真
二、分析【init-ios.sh】腳本做的事情
-
init-ios.sh腳本作用
:腳本會(huì)自動(dòng)下載ffmpeg的主干代碼- 1.找到tools目錄的pull-repo-base.sh腳本并執(zhí)行扩劝,這個(gè)腳本用于下載站托管的github上的FFmpeg分支源碼和FFmpeg依賴(lài)包庸论。
- 2.找到tools目錄的pull-repo-ref.sh腳本并執(zhí)行,這個(gè)腳本用于獲取B站托管的github上的FFmpeg分支,根據(jù)不同的目標(biāo)平臺(tái)放置不同工作目錄
- 后續(xù)會(huì)詳細(xì)介紹pull-repo-base.sh和pull-repo-ref.sh腳本
1棒呛、首先定義了5個(gè)變量聂示,用于下載ffmpeg源碼和ffmpeg依賴(lài)包和創(chuàng)建目錄的文件
// B站托管與github的ffmpeg分支的下載地址
IJK_FFMPEG_UPSTREAM=https://github.com/Bilibili/FFmpeg.git
// IJK_FFMPEG_FORK,和IJK_FFMPEG_UPSTREAM一樣
IJK_FFMPEG_FORK=https://github.com/Bilibili/FFmpeg.git
// ffmpeg版本
IJK_FFMPEG_COMMIT=ff3.1--ijk0.6.1--20160824--001
// ffmpeg下載目錄
IJK_FFMPEG_LOCAL_REPO=extra/ffmpeg
// gas-preprocessor的下載地址
// gas-preprocessor是用于編譯FFmpeg的perl預(yù)處理腳本
IJK_GASP_UPSTREAM=https://github.com/Bilibili/gas-preprocessor.git
2、定義了6個(gè)變量簇秒,用于描述不同架構(gòu)下的源碼存放目錄
// 定義文件目錄
TOOLS=tools
// iOS6架構(gòu)
FF_ALL_ARCHS_IOS6_SDK="armv7 armv7s i386"
// iOS7架構(gòu)
FF_ALL_ARCHS_IOS7_SDK="armv7 armv7s arm64 i386 x86_64"
// iOS8架構(gòu)
FF_ALL_ARCHS_IOS8_SDK="armv7 arm64 i386 x86_64"
// 所有架構(gòu) = iOS8架構(gòu)
FF_ALL_ARCHS=$FF_ALL_ARCHS_IOS8_SDK
// 獲取腳本第一個(gè)參數(shù)
FF_TARGET=$1
3鱼喉、控制腳本執(zhí)行
# 每個(gè)腳本都應(yīng)該在文件開(kāi)頭加上set -e
# 用來(lái)控制腳本執(zhí)行,只要有一行語(yǔ)句的執(zhí)行出錯(cuò)就會(huì)退出。
set -e
4扛禽、定義4個(gè)函數(shù)锋边,用來(lái)執(zhí)行腳本,下載ffmpeg源碼和ffmpeg依賴(lài)庫(kù)编曼,并且放置到對(duì)應(yīng)平臺(tái)架構(gòu)的目錄下
- 4.1
echo_ffmpeg_version函數(shù)功能
::打印IJK_FFMPEG_COMMIT這個(gè)變量值
# 定義函數(shù)【echo_ffmpeg_version】
function echo_ffmpeg_version() {
# 輸出 ffmpeg版本號(hào)
echo $IJK_FFMPEG_COMMIT
}
- 4.2
pull_common函數(shù)功能
:- 1.查看git版本
- 2.執(zhí)行pull-repo-base.sh腳本 下載gas-preprocessor
- 3.執(zhí)行pull-repo-base.sh腳本 下載ffmpeg
# 定義函數(shù)【pull_common】
function pull_common() {
# 查看git版本
git --version
# 輸出 "== pull gas-preprocessor base =="
echo "== pull gas-preprocessor base =="
# $TOOLS => tools $IJK_GASP_UPSTREAM => https://github.com/Bilibili/gas-preprocessor.git
# => sh tools/pull-repo-base.sh https://github.com/Bilibili/gas-preprocessor.git extra/gas-preprocessor
# 執(zhí)行當(dāng)前文件夾下tools文件夾中的pull-repo-base.sh 并且傳入兩個(gè)參數(shù)(https://github.com/Bilibili/gas-preprocessor.git豆巨,extra/gas-preprocessor)下載gas-preprocessor
sh $TOOLS/pull-repo-base.sh $IJK_GASP_UPSTREAM extra/gas-preprocessor
# 輸出 "== pull ffmpeg base =="
echo "== pull ffmpeg base =="
# $TOOLS => tools $IJK_GASP_UPSTREAM => https://github.com/Bilibili/FFmpeg.git IJK_FFMPEG_LOCAL_REPO => extra/ffmpeg
# => sh tools/pull-repo-base.sh https://github.com/Bilibili/FFmpeg.git extra/ffmpeg
# 執(zhí)行當(dāng)前文件夾下tools文件夾中的pull-repo-base.sh 并且傳入兩個(gè)參數(shù)(https://github.com/Bilibili/FFmpeg.git,extra/ffmpeg)掐场,下載FFmpeg
sh $TOOLS/pull-repo-base.sh $IJK_FFMPEG_UPSTREAM $IJK_FFMPEG_LOCAL_REPO
}
- 4.3
pull_fork函數(shù)功能
:- 1.接收一個(gè)平臺(tái)架構(gòu)版本參數(shù)往扔,執(zhí)行pull-repo-ref.sh腳本,
這個(gè)腳本用于獲取B站托管的github上的FFmpeg分支,根據(jù)傳入的不同平臺(tái)架構(gòu)放置不同工作目錄
- 這個(gè)函數(shù)會(huì)調(diào)用四次刻肄,每次傳入的參數(shù)不一樣瓤球,分別是armv7,armv64敏弃,i386,x86_64
- 也就是會(huì)執(zhí)行四次腳本噪馏,下次ffmpeg到對(duì)應(yīng)架構(gòu)平臺(tái)的工作目錄
- 1.接收一個(gè)平臺(tái)架構(gòu)版本參數(shù)往扔,執(zhí)行pull-repo-ref.sh腳本,
# 定義函數(shù)【pull_fork】
function pull_fork() {
# 輸出 平臺(tái)架構(gòu)
echo "== pull ffmpeg fork $1 =="
# $TOOLS => tools $IJK_FFMPEG_FORK => https://github.com/Bilibili/FFmpeg.git IJK_FFMPEG_LOCAL_REPO => extra/ffmpeg
# 執(zhí)行tools文件夾下的pull-repo-ref.sh腳本 并且傳入3個(gè)參數(shù) (https://github.com/Bilibili/FFmpeg.git 麦到, ios/ffmpeg-平臺(tái)架構(gòu) ,extra/ffmpeg)
sh $TOOLS/pull-repo-ref.sh $IJK_FFMPEG_FORK ios/ffmpeg-$1 ${IJK_FFMPEG_LOCAL_REPO}
# 進(jìn)入 ffmpeg-平臺(tái)架構(gòu)文件
cd ios/ffmpeg-$1
# IJK_FFMPEG_COMMIT => ff3.1--ijk0.6.1--20160824--001
# git checkout ff3.1--ijk0.6.1--20160824--001 -B ijkplayer
# 切換到ffmpeg版本分支欠肾,并且強(qiáng)制創(chuàng)建新的分支ijkplayer瓶颠,
git checkout ${IJK_FFMPEG_COMMIT} -B ijkplayer
# 回到上一級(jí)目錄
cd -
}
- 4.4
pull_fork_all函數(shù)功能
:- 調(diào)用4次pull_fork函數(shù),依次傳入armv7刺桃,arm64粹淋,i386,x86_64
- 執(zhí)行效果
- pull_fork armv7
- pull_fork arm64
- pull_fork i386
- pull_fork x86_64
# 定義函數(shù)【pull_fork_all】
function pull_fork_all() {
# 變量$FF_ALL_ARCHS = armv7 arm64 i386 x86_64
# 遍歷FF_ALL_ARCHS瑟慈,依次調(diào)用pull_fork函數(shù)
for ARCH in $FF_ALL_ARCHS
do
pull_fork $ARCH
done
}
5.執(zhí)行執(zhí)行pull_common桃移,pull_fork_all
# 邏輯分支語(yǔ)句
# FF_TARGET => $1
# 執(zhí)行腳本的時(shí)候,沒(méi)有傳任何參數(shù)葛碧,因此$1 = 空
# case "$FF_TARGET" in => case "$1" in => case "" in
# 不滿(mǎn)足任何條件借杰,執(zhí)行 *) 后面的語(yǔ)句(執(zhí)行pull_common,pull_fork_all函數(shù))
case "$FF_TARGET" in
ffmpeg-version)
echo_ffmpeg_version
;;
armv7|armv7s|arm64|i386|x86_64)
pull_common
pull_fork $FF_TARGET
;;
all|*)
pull_common
pull_fork_all
;;
esac
二进泼、分析【pull-repo-base.sh】腳本做的事情
-
pull-repo-base.sh腳本作用
:用于下載B站托管的github上的FFmpeg分支源碼和FFmpeg依賴(lài)包 - 當(dāng)前腳本會(huì)執(zhí)行二次,分別下載gas-preprocessor和FFmpeg蔗衡,先下載gas-preprocessor,在下載FFmpeg乳绕,因?yàn)镕Fmpeg必須依賴(lài)gas-preprocessor
1.接收2個(gè)腳本參數(shù)
// 下載遠(yuǎn)程代碼的地址
// gas-preprocessor => https://github.com/Bilibili/gas-preprocessor.git
// ffmpeg => https://github.com/Bilibili/FFmpeg.git
REMOTE_REPO=$1
// 需要下載的遠(yuǎn)程代碼clone到本地的位置(extra/gas-preprocessor绞惦,extra/ffmpeg)
LOCAL_WORKSPACE=$2
2.克隆ffmpeg源碼到本地倉(cāng)庫(kù)
- 2.1 判斷2個(gè)參數(shù)是否有值
- 2.2 判斷文件是否存在,一開(kāi)始都不存在洋措,克隆源碼到本地目錄LOCAL_WORKSPACE
2.3 執(zhí)行
https://github.com/Bilibili/gas-preprocessor.git extra/gas-preprocessor
或者git clone https://github.com/Bilibili/FFmpeg.git extra/ffmpeg
2.4 執(zhí)行pull-repo-base.sh腳本后济蝉,ijkplayer目錄效果
# 判斷2個(gè)參數(shù)是否有值
if [ -z $REMOTE_REPO -o -z $LOCAL_WORKSPACE ]; then
echo "invalid call pull-repo.sh '$REMOTE_REPO' '$LOCAL_WORKSPACE'"
# 判斷文件是否存在,一開(kāi)始都不存在
elif [ ! -d $LOCAL_WORKSPACE ]; then
# 克隆源碼到本地目錄LOCAL_WORKSPACE
git clone $REMOTE_REPO $LOCAL_WORKSPACE
else
cd $LOCAL_WORKSPACE
git fetch --all --tags
cd -
fi
三、分析【pull-repo-ref.sh】腳本做的事情
-
pull-repo-ref.sh腳本作用
:下載B站托管的github上的FFmpeg分支,分別根據(jù)不同的架構(gòu)平臺(tái)創(chuàng)建對(duì)應(yīng)的目錄堆生,把ffmpeg源碼放置不同架構(gòu)平臺(tái)的工作目錄中 `平臺(tái)架構(gòu)`:armv7专缠,arm64,i386淑仆,x86_64
- 當(dāng)前腳本會(huì)執(zhí)行四次
1.接收3個(gè)腳本參數(shù)
// B站自己托管站github的FFmpeg
REMOTE_REPO=https://github.com/Bilibili/FFmpeg.git
// 本地目標(biāo)倉(cāng)庫(kù)存放位置涝婉,xxx為架構(gòu)平臺(tái)版本(armv7,arm64蔗怠,i386墩弯,x86_64)
LOCAL_WORKSPACE=ios/ffmpeg-xxx
// 遠(yuǎn)程ffmpe官方倉(cāng)庫(kù)clone到本地的位置
REF_REPO=extra/ffmpeg
2.克隆ffmpeg源碼到本地倉(cāng)庫(kù)
- 2.1 判斷3個(gè)參數(shù)字符串是否為空
- 2.2 判斷文件是否存在,一開(kāi)始都不存在寞射,克隆ffmpeg源碼到本地倉(cāng)庫(kù)
- 2.3 執(zhí)行
git clone --reference extra/ffmpeg https://github.com/Bilibili/FFmpeg.git ios/ffmpeg-平臺(tái)版本
2.4 執(zhí)行pull-repo-ref.sh腳本后
# 判斷3個(gè)參數(shù)字符串是否為空
if [ -z $1 -o -z $2 -o -z $3 ]; then
echo "invalid call pull-repo.sh '$1' '$2' '$3'"
# 判斷文件是否存在渔工,一開(kāi)始都不存在,所以執(zhí)行 git clone --reference $REF_REPO $REMOTE_REPO $LOCAL_WORKSPACE
elif [ ! -d $LOCAL_WORKSPACE ]; then
# git clone --reference extra/ffmpeg https://github.com/Bilibili/FFmpeg.git ios/ffmpeg-armv7
git clone --reference $REF_REPO $REMOTE_REPO $LOCAL_WORKSPACE
# 進(jìn)入到本地倉(cāng)庫(kù)目錄
cd $LOCAL_WORKSPACE
# 將版本庫(kù)未打包的松散對(duì)象打包
git repack -a
else
cd $LOCAL_WORKSPACE
git fetch --all --tags
cd -
fi
3.為什么這里的clone加了--reference參數(shù)桥温?
git clone --reference來(lái)獲取B站得FFmpeg,實(shí)際上根據(jù)用法介紹,--reference是為了減少?gòu)木W(wǎng)絡(luò)獲取的文件引矩,盡可能從本地的倉(cāng)庫(kù)中獲取侵浸;
由于一開(kāi)始的時(shí)候已經(jīng)獲取了官方ffmpeg代碼旺韭,在獲取B站的分支倉(cāng)庫(kù)時(shí)就可以將之前下好的官方倉(cāng)庫(kù)的本地庫(kù)作為參考倉(cāng)庫(kù)