帶你走進(jìn)腳本世界,ijkplayer之【init-ios.sh】腳本分析

前言

集成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ō)明

執(zhí)行腳本.png

下載ijkplayer,查看init-ios.sh文件

  • 去到B站得github主頁(yè)魏滚,找到ijkplayer項(xiàng)目镀首,下載源碼 ijkplayer下載地址
  • init-ios.sh目錄
Snip20160827_4.png

一、了解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腳本
Snip20160827_5.png

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)的工作目錄
# 定義函數(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
Snip20160827_1.png
  • 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目錄效果
    
執(zhí)行腳本后.png
#   判斷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ù)
執(zhí)行pull-repo-ref.sh腳本前.png
  • 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腳本后
    
執(zhí)行pull-repo-ref.sh腳本后.png
#  判斷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ù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市掏觉,隨后出現(xiàn)的幾起案子区端,更是在濱河造成了極大的恐慌,老刑警劉巖澳腹,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件织盼,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡酱塔,警方通過(guò)查閱死者的電腦和手機(jī)沥邻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)延旧,“玉大人谋国,你說(shuō)我怎么就攤上這事∏” “怎么了芦瘾?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)集畅。 經(jīng)常有香客問(wèn)我近弟,道長(zhǎng),這世上最難降的妖魔是什么挺智? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任祷愉,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘二鳄。我一直安慰自己赴涵,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布订讼。 她就那樣靜靜地躺著髓窜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪欺殿。 梳的紋絲不亂的頭發(fā)上寄纵,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音脖苏,去河邊找鬼程拭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛棍潘,可吹牛的內(nèi)容都是我干的恃鞋。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蜒谤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼山宾!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起鳍徽,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎敢课,沒(méi)想到半個(gè)月后阶祭,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡直秆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年濒募,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片圾结。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瑰剃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出筝野,到底是詐尸還是另有隱情晌姚,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布歇竟,位于F島的核電站挥唠,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏焕议。R本人自食惡果不足惜宝磨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧唤锉,春花似錦世囊、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至壁肋,卻和暖如春号胚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背浸遗。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工猫胁, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人跛锌。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓弃秆,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親髓帽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子菠赚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容