带你走进脚本世界,ijkplayer之【init-ios.sh】脚本分析

前言

集成ijkplayer,需要执行脚本init-ios.sh,那么init-ios.sh脚本干嘛用的了,花了半天时间,学习了下shell脚本,感觉脚本语言学起来还是比较容易上手的,现在仅仅能看懂了,但是要自己写,还需要花点时间,下面就拿脚本文件练练手,不知道理解的对不对,还希望多交流.
后续会持续发布,教你从零开始搭建一个完整的iOS直播app,希望能帮助到更多的人更快的了解直播。
如果喜欢我的文章,可以关注我微博:袁峥Seemygo

ijkplayer集成官方说明

执行脚本.png

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

  • 去到B站得github主页,找到ijkplayer项目,下载源码 ijkplayer下载地址
  • init-ios.sh目录
Snip20160827_4.png

一、了解shell基本语法

#  ***********shell基本语法***********
#   1. # : 注释

#   2. 定义变量 a = 3

#   3. $a : 获取变量a => $a = 3

#   4. 条件语句 if 条件 then 执行语句 fi,满足条件 就会than后面的执行语句

#   5. set -e 任何语句的执行结果不是true则应该退出。这样的好处是防止错误像滚雪球般变大导致一个致命的错误,而这些错误本应该在之前就被处理掉

#   6. 函数定义 function 函数名()

#   7. echo 打印

#   8. sh: 执行脚本文件 sh a.sh =》 执行脚本文件a.sh

#   9. $1:获取参数第一个参数

#   10.$*:获取参数所有参数

#   11.case:逻辑分支语句
   
   case 值 in
        条件1)command1 ;;
        *)command2 ;;
   esac
   
   值等于条件1,就会执行command1,否则不执行,不满足,就会执行command2
   
   * : 表示当使用前面的各种模式均无法匹配该变量时,将执行*后的命令

#   12.for:循环语句

    for var in item1 item2 ... itemN
    do
    command1
    done
    
    遍历in后边的变量,一个一个给var赋值,在执行command1

#   13.cd - : 回到上一级目录
#   14.脚本开头 #!/usr/bin/env作用 : 在linux的一些bash的脚本,需在开头一行指定脚本的解释程序,如: #!/usr/bin/env
#   15.-z 字符串 : 没有字符串就为真
#   16.-o : 或
#   17.!  : 非
#   18.-d : 是目录就为真

二、分析【init-ios.sh】脚本做的事情

  • init-ios.sh脚本作用 :脚本会自动下载ffmpeg的主干代码
    • 1.找到tools目录的pull-repo-base.sh脚本并执行,这个脚本用于下载站托管的github上的FFmpeg分支源码和FFmpeg依赖包。
    • 2.找到tools目录的pull-repo-ref.sh脚本并执行,这个脚本用于获取B站托管的github上的FFmpeg分支,根据不同的目标平台放置不同工作目录
    • 后续会详细介绍pull-repo-base.sh和pull-repo-ref.sh脚本
Snip20160827_5.png

1、首先定义了5个变量,用于下载ffmpeg源码和ffmpeg依赖包和创建目录的文件

// 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预处理脚本
IJK_GASP_UPSTREAM=https://github.com/Bilibili/gas-preprocessor.git

2、定义了6个变量,用于描述不同架构下的源码存放目录

// 定义文件目录
TOOLS=tools

// iOS6架构
FF_ALL_ARCHS_IOS6_SDK="armv7 armv7s i386"

// iOS7架构
FF_ALL_ARCHS_IOS7_SDK="armv7 armv7s arm64 i386 x86_64"

// iOS8架构
FF_ALL_ARCHS_IOS8_SDK="armv7 arm64 i386 x86_64"

// 所有架构 = iOS8架构
FF_ALL_ARCHS=$FF_ALL_ARCHS_IOS8_SDK

// 获取脚本第一个参数
FF_TARGET=$1

3、控制脚本执行

# 每个脚本都应该在文件开头加上set -e
# 用来控制脚本执行,只要有一行语句的执行出错就会退出。
set -e

4、定义4个函数,用来执行脚本,下载ffmpeg源码和ffmpeg依赖库,并且放置到对应平台架构的目录下

  • 4.1 echo_ffmpeg_version函数功能::打印IJK_FFMPEG_COMMIT这个变量值
# 定义函数【echo_ffmpeg_version】

function echo_ffmpeg_version() {
#   输出 ffmpeg版本号
    echo $IJK_FFMPEG_COMMIT
}
  • 4.2 pull_common函数功能
    • 1.查看git版本
    • 2.执行pull-repo-base.sh脚本 下载gas-preprocessor
    • 3.执行pull-repo-base.sh脚本 下载ffmpeg
#  定义函数【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

#   执行当前文件夹下tools文件夹中的pull-repo-base.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

#   执行当前文件夹下tools文件夹中的pull-repo-base.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函数功能
    • 1.接收一个平台架构版本参数,执行pull-repo-ref.sh脚本,这个脚本用于获取B站托管的github上的FFmpeg分支,根据传入的不同平台架构放置不同工作目录
    • 这个函数会调用四次,每次传入的参数不一样,分别是armv7,armv64,i386,x86_64
    • 也就是会执行四次脚本,下次ffmpeg到对应架构平台的工作目录
# 定义函数【pull_fork】
function pull_fork() {
#   输出 平台架构
    echo "== pull ffmpeg fork $1 =="

#   $TOOLS => tools $IJK_FFMPEG_FORK => https://github.com/Bilibili/FFmpeg.git IJK_FFMPEG_LOCAL_REPO => extra/ffmpeg

#   执行tools文件夹下的pull-repo-ref.sh脚本 并且传入3个参数 (https://github.com/Bilibili/FFmpeg.git , ios/ffmpeg-平台架构 ,extra/ffmpeg)

    sh $TOOLS/pull-repo-ref.sh $IJK_FFMPEG_FORK ios/ffmpeg-$1 ${IJK_FFMPEG_LOCAL_REPO}
    
#   进入 ffmpeg-平台架构文件
    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版本分支,并且强制创建新的分支ijkplayer,
    git checkout ${IJK_FFMPEG_COMMIT} -B ijkplayer
    
#   回到上一级目录
    cd -
}
  • 4.4 pull_fork_all函数功能
    • 调用4次pull_fork函数,依次传入armv7,arm64,i386,x86_64
    • 执行效果
      • pull_fork armv7
      • pull_fork arm64
      • pull_fork i386
      • pull_fork x86_64
# 定义函数【pull_fork_all】
function pull_fork_all() {
    # 变量$FF_ALL_ARCHS =  armv7 arm64 i386 x86_64
    # 遍历FF_ALL_ARCHS,依次调用pull_fork函数
    for ARCH in $FF_ALL_ARCHS
    do
        pull_fork $ARCH
    done
}

5.执行执行pull_common,pull_fork_all

#   逻辑分支语句
#   FF_TARGET => $1
#   执行脚本的时候,没有传任何参数,因此$1 = 空
#   case "$FF_TARGET" in => case "$1" in => case "" in

#   不满足任何条件,执行 *) 后面的语句(执行pull_common,pull_fork_all函数)

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依赖包
  • 当前脚本会执行二次,分别下载gas-preprocessor和FFmpeg,先下载gas-preprocessor,在下载FFmpeg,因为FFmpeg必须依赖gas-preprocessor

1.接收2个脚本参数

// 下载远程代码的地址
// gas-preprocessor => https://github.com/Bilibili/gas-preprocessor.git
// ffmpeg => https://github.com/Bilibili/FFmpeg.git
REMOTE_REPO=$1

// 需要下载的远程代码clone到本地的位置(extra/gas-preprocessor,extra/ffmpeg)
LOCAL_WORKSPACE=$2

2.克隆ffmpeg源码到本地仓库

  • 2.1 判断2个参数是否有值
  • 2.2 判断文件是否存在,一开始都不存在,克隆源码到本地目录LOCAL_WORKSPACE
Snip20160827_1.png
  • 2.3 执行 https://github.com/Bilibili/gas-preprocessor.git extra/gas-preprocessor 或者 git clone https://github.com/Bilibili/FFmpeg.git extra/ffmpeg

  • 2.4 执行pull-repo-base.sh脚本后,ijkplayer目录效果
    
执行脚本后.png
#   判断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
#   克隆源码到本地目录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分支,分别根据不同的架构平台创建对应的目录,把ffmpeg源码放置不同架构平台的工作目录中
  •  `平台架构`:armv7,arm64,i386,x86_64
    
  • 当前脚本会执行四次

1.接收3个脚本参数

// B站自己托管站github的FFmpeg
REMOTE_REPO=https://github.com/Bilibili/FFmpeg.git 

//  本地目标仓库存放位置,xxx为架构平台版本(armv7,arm64,i386,x86_64)
LOCAL_WORKSPACE=ios/ffmpeg-xxx 

// 远程ffmpe官方仓库clone到本地的位置
REF_REPO=extra/ffmpeg 

2.克隆ffmpeg源码到本地仓库

  • 2.1 判断3个参数字符串是否为空
  • 2.2 判断文件是否存在,一开始都不存在,克隆ffmpeg源码到本地仓库
执行pull-repo-ref.sh脚本前.png
  • 2.3 执行git clone --reference extra/ffmpeg https://github.com/Bilibili/FFmpeg.git ios/ffmpeg-平台版本
  • 2.4 执行pull-repo-ref.sh脚本后
    
执行pull-repo-ref.sh脚本后.png
#  判断3个参数字符串是否为空

if [ -z $1 -o -z $2 -o -z $3 ]; then
    echo "invalid call pull-repo.sh '$1' '$2' '$3'"
    
#   判断文件是否存在,一开始都不存在,所以执行 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
    
#   进入到本地仓库目录
    cd $LOCAL_WORKSPACE
    
#   将版本库未打包的松散对象打包
    git repack -a
else
    cd $LOCAL_WORKSPACE
    git fetch --all --tags
    cd -
fi

3.为什么这里的clone加了--reference参数?

  • git clone --reference来获取B站得FFmpeg,实际上根据用法介绍,--reference是为了减少从网络获取的文件,尽可能从本地的仓库中获取;

  • 由于一开始的时候已经获取了官方ffmpeg代码,在获取B站的分支仓库时就可以将之前下好的官方仓库的本地库作为参考仓库

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容