前言

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

ijkplayer集成官方说明

执行脚本.png

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

Snip20160827_4.png

一、了解shell基本语法

 #  ***********shell基本语法***********
# . # : 注释 # . 定义变量 a = # . $a : 获取变量a => $a = # . 条件语句 if 条件 then 执行语句 fi,满足条件 就会than后面的执行语句 # . set -e 任何语句的执行结果不是true则应该退出。这样的好处是防止错误像滚雪球般变大导致一个致命的错误,而这些错误本应该在之前就被处理掉 # . 函数定义 function 函数名() # . echo 打印 # . sh: 执行脚本文件 sh a.sh =》 执行脚本文件a.sh # . $:获取参数第一个参数 # .$*:获取参数所有参数 # .case:逻辑分支语句 case 值 in
条件1)command1 ;;
*)command2 ;;
esac 值等于条件1,就会执行command1,否则不执行,不满足,就会执行command2 * : 表示当使用前面的各种模式均无法匹配该变量时,将执行*后的命令 # .for:循环语句 for var in item1 item2 ... itemN
do
command1
done 遍历in后边的变量,一个一个给var赋值,在执行command1 # .cd - : 回到上一级目录
# .脚本开头 #!/usr/bin/env作用 : 在linux的一些bash的脚本,需在开头一行指定脚本的解释程序,如: #!/usr/bin/env
# .-z 字符串 : 没有字符串就为真
# .-o : 或
# .! : 非
# .-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.--ijk0.6.1---- // 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=$
 

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-$ ${IJK_FFMPEG_LOCAL_REPO} # 进入 ffmpeg-平台架构文件
cd ios/ffmpeg-$ # IJK_FFMPEG_COMMIT => ff3.--ijk0.6.1---- # git checkout ff3.--ijk0.6.1---- -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 => $
# 执行脚本的时候,没有传任何参数,因此$ = 空
# 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=$ // 需要下载的远程代码clone到本地的位置(extra/gas-preprocessor,extra/ffmpeg)
LOCAL_WORKSPACE=$

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 $ -o -z $ -o -z $ ]; 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站的分支仓库时就可以将之前下好的官方仓库的本地库作为参考仓库

 
文/袁峥Seemygo(简书作者)
原文链接:http://www.jianshu.com/p/9b0887596826
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

带你走进脚本世界,ijkplayer之【init-ios.sh】脚本分析的更多相关文章

  1. 小丁带你走进git世界一-git简单配置

    小丁带你走进git世界一-git简单配置 1.github的简单配置 配置提交代码的信息,例如是谁提交的代码之类的. git config  –global user.name BattleHeaer ...

  2. 带你走进webpack世界,成为webpack头号玩家。

    最近朋友圈被<头号玩家>刷爆了,斯皮尔伯格一个资深电影导演,把对过去经典的致敬,对未来的憧憬浓缩在这一部电影中,可以说让观众燃了起来. 观望整个前端开发,不断的演化,发展迅速.前端开发从最 ...

  3. 小丁带你走进git世界五-远程仓库

    一.文件,指令讲解 首先讲一下远程仓库和本地仓库在文件上面的区别,首先我们来看下对比图(当然这里说的区别是在于.git文件下面的文件内容,至于里面内容我们不会关注)這裡我们进行了相同的操作就是本地仓库 ...

  4. 小丁带你走进git的世界三-撤销修改

    一.撤销指令 git checkout还原工作区的功能 git reset  还原暂存区的功能 git clean  还没有被添加进暂存区的文件也就是git还没有跟踪的文件可以使用这个命令清除他们 g ...

  5. 小丁带你走进git的世界三-撤销修改(转)

    一.撤销指令 git checkout还原工作区的功能 git reset  还原暂存区的功能 git clean  还没有被添加进暂存区的文件也就是git还没有跟踪的文件可以使用这个命令清除他们 g ...

  6. 小丁带你走进git的世界二-工作区暂存区分支

    小丁带你走进git的世界二-工作区暂存区分支 一.Git基本工作流程 1.初始化一个仓库 git  init git  clone git仓库分为两种情况: 第一种是在现有项目或目录下导入所有文件到 ...

  7. 带你走进rsync的世界

    导读 Rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件,也可以使用 Rsync 同步本地硬盘中的不同目录.rsync共有3种使用方 ...

  8. Miox带你走进动态路由的世界——51信用卡前端团队

    写在前面: 有的时候再做大型项目的时候,确实会被复杂的路由逻辑所烦恼,会经常遇到权限问题,路由跳转回退逻辑问题.这几天在网上看到了51信用卡团队开源了一个Miox,可以有效的解决这些痛点,于是乎我就做 ...

  9. MYSQL(基本篇)——一篇文章带你走进MYSQL的奇妙世界

    MYSQL(基本篇)--一篇文章带你走进MYSQL的奇妙世界 MYSQL算是我们程序员必不可少的一份求职工具了 无论在什么岗位,我们都可以看到应聘要求上所书写的"精通MYSQL等数据库及优化 ...

随机推荐

  1. 2014年web页面上的3D新产品介绍

    地图对于数据的可视化展现有独到的显示方式,首先是底图.地图提供了一个定位的蓝图,让用例数据可以有参考的背景,因此底图通常是线画矢量图或者影像图.互联网上提供这种服务的基本以Google风格,也就是Ti ...

  2. python基础之练习题(二)

    九九乘法表 i = 0 #while 九九乘法表 j = 0 while i < 9: i += 1 while j<9: j += 1 sum = i + j total="% ...

  3. R-CNN论文详解 - CSDN博客

    废话不多说,上车吧,少年 paper链接:Rich feature hierarchies for accurate object detection and semantic segmentatio ...

  4. MVC和观察者模式

    用观察者模式实现MVC框架! http://wenku.baidu.com/view/eff8bab069dc5022aaea0007.html 写的不错! Observer和ConcreteObse ...

  5. 数据块加密模式以及IV的意思

    (本文资料主要来自:http://en.wikipedia.org/wiki/Block_cipher_mode_of_operation) 目前流行的加密和数字认证算法,都是采用块加密(block ...

  6. Linux查看某一个端口监听情况

    1.使用lsof   lsof -i:端口号查看某个端口是否被占用 2.使用netstat 使用netstat -anp|grep 80 

  7. Linux Find命令使用方法举例

    linux命令之find命令使用举例. 在当前目录和子目录下查找文件MyCProgram.c  # find . -name "MyCProgram.c" 查找文件且忽略大小写  ...

  8. Java基础反射(二)

    原文地址http://blog.csdn.net/sinat_38259539/article/details/71799078 反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Cla ...

  9. python开发之路目录

    Python 目录 基础 python入门 python数据类型.字符编码.文件处理 python函数基础 python函数进阶 python装饰器函数 python装饰器函数 python递归函数 ...

  10. What do you think the coming adidas NMD Singapore

    adidas NMD Singapore is surprising everybody with a lot of completely new NMD choices combined with ...