带你走进脚本世界,ijkplayer之【init-ios.sh】脚本分析
2016-09-22 11:29
162 查看
前言
集成ijkplayer,需要执行脚本
init-ios.sh,那么
init-ios.sh脚本干嘛用的了,花了半天时间,学习了下shell脚本,感觉脚本语言学起来还是比较容易上手的,现在仅仅能看懂了,但是要自己写,还需要花点时间,下面就拿脚本文件练练手,不知道理解的对不对,还希望多交流.
后续会持续发布,教你
从零开始搭建一个完整的iOS直播app,希望能帮助到更多的人更快的了解直播。
如果喜欢我的文章,可以关注我微博:
简书留言
ijkplayer集成官方说明
执行脚本.png
下载ijkplayer,查看init-ios.sh文件
去到B站得github主页,找到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:执行脚本文件sha.sh=》执行脚本文件a.sh #9.$1:获取参数第一个参数 #10.$*:获取参数所有参数 #11.case:逻辑分支语句 case值in 条件1)command1;; *)command2;; esac 值等于条件1,就会执行command1,否则不执行,不满足,就会执行command2 *:表示当使用前面的各种模式均无法匹配该变量时,将执行*后的命令 #12.for:循环语句 forvarinitem1item2...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="armv7armv7si386" //iOS7架构 FF_ALL_ARCHS_IOS7_SDK="armv7armv7sarm64i386x86_64" //iOS8架构 FF_ALL_ARCHS_IOS8_SDK="armv7arm64i386x86_64" //所有架构=iOS8架构 FF_ALL_ARCHS=$FF_ALL_ARCHS_IOS8_SDK //获取脚本第一个参数 FF_TARGET=$1
3、控制脚本执行
#每个脚本都应该在文件开头加上set-e#用来控制脚本执行,只要有一行语句的执行出错就会退出。
set-e
4、定义4个函数,用来执行脚本,下载ffmpeg源码和ffmpeg依赖库,并且放置到对应平台架构的目录下
4.1echo_ffmpeg_version函数功能::打印IJK_FFMPEG_COMMIT这个变量值
#定义函数【echo_ffmpeg_version】 functionecho_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】 functionpull_common(){ #查看git版本 git--version #输出"==pullgas-preprocessorbase==" echo"==pullgas-preprocessorbase==" #$TOOLS=>tools$IJK_GASP_UPSTREAM=>https://github.com/Bilibili/gas-preprocessor.git #=>shtools/pull-repo-base.sh https://github.com/Bilibili/gas-preprocessor.gitextra/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_UPSTREAMextra/gas-preprocessor #输出"==pullffmpegbase==" echo"==pullffmpegbase==" #$TOOLS=>tools$IJK_GASP_UPSTREAM=> https://github.com/Bilibili/FFmpeg.gitIJK_FFMPEG_LOCAL_REPO=>extra/ffmpeg #=>shtools/pull-repo-base.sh https://github.com/Bilibili/FFmpeg.gitextra/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】 functionpull_fork(){ #输出平台架构 echo"==pullffmpegfork$1==" #$TOOLS=>tools$IJK_FFMPEG_FORK=>https://github.com/Bilibili/FFmpeg.gitIJK_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_FORKios/ffmpeg-$1${IJK_FFMPEG_LOCAL_REPO} #进入ffmpeg-平台架构文件 cdios/ffmpeg-$1 #IJK_FFMPEG_COMMIT=>ff3.1--ijk0.6.1--20160824--001 #gitcheckoutff3.1--ijk0.6.1--20160824--001-Bijkplayer #切换到ffmpeg版本分支,并且强制创建新的分支ijkplayer, gitcheckout${IJK_FFMPEG_COMMIT}-Bijkplayer #回到上一级目录 cd- }
4.4
pull_fork_all函数功能:
调用4次pull_fork函数,依次传入armv7,arm64,i386,x86_64
执行效果
pull_forkarmv7
pull_forkarm64
pull_forki386
pull_forkx86_64
#定义函数【pull_fork_all】
functionpull_fork_all(){
#变量$FF_ALL_ARCHS=armv7arm64i386x86_64
#遍历FF_ALL_ARCHS,依次调用pull_fork函数
forARCHin$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.gitREMOTE_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.gitextra/gas-preprocessor或者
gitclonehttps://github.com/Bilibili/FFmpeg.gitextra/ffmpeg
2.4执行pull-repo-base.sh脚本后,ijkplayer目录效果
执行脚本后.png
#判断2个参数是否有值
if[-z$REMOTE_REPO-o-z$LOCAL_WORKSPACE];then
echo"invalidcallpull-repo.sh'$REMOTE_REPO''$LOCAL_WORKSPACE'"
#判断文件是否存在,一开始都不存在
elif[!-d$LOCAL_WORKSPACE];then
#克隆源码到本地目录LOCAL_WORKSPACE
gitclone$REMOTE_REPO$LOCAL_WORKSPACE
else
cd$LOCAL_WORKSPACE
gitfetch--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执行
gitclone--referenceextra/ffmpeghttps://github.com/Bilibili/FFmpeg.gitios/ffmpeg-平台版本
2.4执行pull-repo-ref.sh脚本后
执行pull-repo-ref.sh脚本后.png
#判断3个参数字符串是否为空
if[-z$1-o-z$2-o-z$3];then
echo"invalidcallpull-repo.sh'$1''$2''$3'"
#判断文件是否存在,一开始都不存在,所以执行gitclone--reference$REF_REPO$REMOTE_REPO$LOCAL_WORKSPACE
elif[!-d$LOCAL_WORKSPACE];then
#gitclone--referenceextra/ffmpeghttps://github.com/Bilibili/FFmpeg.gitios/ffmpeg-armv7
gitclone--reference$REF_REPO$REMOTE_REPO$LOCAL_WORKSPACE
#进入到本地仓库目录
cd$LOCAL_WORKSPACE
#将版本库未打包的松散对象打包
gitrepack-a
else
cd$LOCAL_WORKSPACE
gitfetch--all--tags
cd-
fi
3.为什么这里的clone加了--reference参数?
gitclone--reference来获取B站得FFmpeg,实际上根据用法介绍,--reference是为了减少从网络获取的文件,尽可能从本地的仓库中获取;由于一开始的时候已经获取了官方ffmpeg代码,在获取B站的分支仓库时就可以将之前下好的官方仓库的本地库作为参考仓库
文/袁峥Seemygo(简书作者)
原文链接:http://www.jianshu.com/p/9b0887596826
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
相关文章推荐
- 带你走进脚本世界,ijkplayer之【init-ios.sh】脚本分析
- ijkplayer编译脚本分析(一)——init-android.sh
- build/envsetup.sh脚本分析
- build/envsetup.sh脚本分析
- initrd.img中的init脚本分析,load_modules()分析
- 生产环境-linux-catalina.sh脚本停止不了服务分析解决
- tomcat运行控制脚本catalina.sh分析
- init进程 && 解析Android启动脚本init.rc && 修改它使不启动android && init.rc中启动一个sh文件
- wdcp的环境搭建shell脚本分析--lanmp.sh---lib/common.sh
- android init 进程分析 (3 初始化脚本)
- Kivy a to z -- Kivy的编译过程-distribute.sh脚本分析
- wdcp的环境搭建shell脚本分析--install.sh
- 正确的sh脚本,拷贝到 init.d
- Hadoop学习笔记(一)HBase脚本分析(二)hbase-daemon.sh
- Hadoop学习笔记(一)HBase脚本分析(一)start-hbase.sh
- freescale-sdk linux移植一搭建编译环境脚本host-prepare.sh分析
- build/envsetup.sh脚本分析
- build/envsetup.sh 脚本分析 -- lunch函数
- HADOOP1.0.3的start-dfs.sh系列脚本分析
- tomcat启动脚本startup.sh分析