带你走进脚本世界,ijkplayer之【init-ios.sh】脚本分析
前言
集成ijkplayer,需要执行脚本init-ios.sh,那么init-ios.sh脚本干嘛用的了,花了半天时间,学习了下shell脚本,感觉脚本语言学起来还是比较容易上手的,现在仅仅能看懂了,但是要自己写,还需要花点时间,下面就拿脚本文件练练手,不知道理解的对不对,还希望多交流.
后续会持续发布,教你从零开始搭建一个完整的iOS直播app,希望能帮助到更多的人更快的了解直播。
如果喜欢我的文章,可以关注我微博:袁峥Seemygo,也可以来小码哥,了解下我们的iOS培训课程。后续还会更新更多内容,有任何问题,欢迎简书留言袁峥Seemygo。。。
ijkplayer集成官方说明
下载ijkplayer,查看init-ios.sh文件
- 去到B站得github主页,找到ijkplayer项目,下载源码 ijkplayer下载地址
- init-ios.sh目录
一、了解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脚本
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到对应架构平台的工作目录
- 1.接收一个平台架构版本参数,执行pull-repo-ref.sh脚本,
# 定义函数【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
2.3 执行
https://github.com/Bilibili/gas-preprocessor.git extra/gas-preprocessor或者git clone https://github.com/Bilibili/FFmpeg.git extra/ffmpeg2.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源码到本地仓库
- 2.3 执行
git clone --reference extra/ffmpeg https://github.com/Bilibili/FFmpeg.git ios/ffmpeg-平台版本- 2.4 执行pull-repo-ref.sh脚本后
# 判断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站的分支仓库时就可以将之前下好的官方仓库的本地库作为参考仓库
原文链接:http://www.jianshu.com/p/9b0887596826
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
带你走进脚本世界,ijkplayer之【init-ios.sh】脚本分析的更多相关文章
- 小丁带你走进git世界一-git简单配置
小丁带你走进git世界一-git简单配置 1.github的简单配置 配置提交代码的信息,例如是谁提交的代码之类的. git config –global user.name BattleHeaer ...
- 带你走进webpack世界,成为webpack头号玩家。
最近朋友圈被<头号玩家>刷爆了,斯皮尔伯格一个资深电影导演,把对过去经典的致敬,对未来的憧憬浓缩在这一部电影中,可以说让观众燃了起来. 观望整个前端开发,不断的演化,发展迅速.前端开发从最 ...
- 小丁带你走进git世界五-远程仓库
一.文件,指令讲解 首先讲一下远程仓库和本地仓库在文件上面的区别,首先我们来看下对比图(当然这里说的区别是在于.git文件下面的文件内容,至于里面内容我们不会关注)這裡我们进行了相同的操作就是本地仓库 ...
- 小丁带你走进git的世界三-撤销修改
一.撤销指令 git checkout还原工作区的功能 git reset 还原暂存区的功能 git clean 还没有被添加进暂存区的文件也就是git还没有跟踪的文件可以使用这个命令清除他们 g ...
- 小丁带你走进git的世界三-撤销修改(转)
一.撤销指令 git checkout还原工作区的功能 git reset 还原暂存区的功能 git clean 还没有被添加进暂存区的文件也就是git还没有跟踪的文件可以使用这个命令清除他们 g ...
- 小丁带你走进git的世界二-工作区暂存区分支
小丁带你走进git的世界二-工作区暂存区分支 一.Git基本工作流程 1.初始化一个仓库 git init git clone git仓库分为两种情况: 第一种是在现有项目或目录下导入所有文件到 ...
- 带你走进rsync的世界
导读 Rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件,也可以使用 Rsync 同步本地硬盘中的不同目录.rsync共有3种使用方 ...
- Miox带你走进动态路由的世界——51信用卡前端团队
写在前面: 有的时候再做大型项目的时候,确实会被复杂的路由逻辑所烦恼,会经常遇到权限问题,路由跳转回退逻辑问题.这几天在网上看到了51信用卡团队开源了一个Miox,可以有效的解决这些痛点,于是乎我就做 ...
- MYSQL(基本篇)——一篇文章带你走进MYSQL的奇妙世界
MYSQL(基本篇)--一篇文章带你走进MYSQL的奇妙世界 MYSQL算是我们程序员必不可少的一份求职工具了 无论在什么岗位,我们都可以看到应聘要求上所书写的"精通MYSQL等数据库及优化 ...
随机推荐
- HDU_3486_Interviewe
Interviewe Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- Tfs 2015 代理池配置笔记
Tfs的构建代理池其实是在代理服务器上开启一个TFSBuild的代理服务,配好相关的Tfs地址后,就能在Tfs管理界面看到了. 如果是Tfs服务和发布代理是同一台服务器,具体操作详见: 安装TFS20 ...
- gnome,xfce,unity,vncserver chinese,jvm locale language
__________________________ yum search vnc-server sudo yum install tigervnc-server vncserver -list ...
- kubernetes实战(八):k8s集群安全机制RBAC
1.基本概念 RBAC(Role-Based Access Control,基于角色的访问控制)在k8s v1.5中引入,在v1.6版本时升级为Beta版本,并成为kubeadm安装方式下的默认选项, ...
- 信号(Django信号、Flask信号、Scrapy信号)
简介 Django.Flask.scrapy都包含了一个“信号分配器”,使得当一些动作在框架的其他地方发生的时候,解耦的应用可以得到提醒. 通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒 ...
- 【调研与分析】标杆学习、知识管理和竞争情报的关系——From Team
注: 1)红色实线箭头表示可以直接使用:例如竞争情报业务输出产品之一的标杆文档可以直接作为公司标杆学习中外部标杆的资料: 2)蓝色虚线箭头表示转化后使用或者间接利用的关系:例如专题调研可以帮助建立内部 ...
- innobackupex 还原和备份实例
InnoDB 和非 InnoDB 文件的备份都是通过拷贝文件来做的,但是实现的方式不同,前者是以page为粒度做的(xtrabackup),后者是 cp 或者 tar 命令(innobackupex) ...
- git-【三】理解工作区与暂存区的区别
基本概念 工作区:就是你在电脑上看到的目录,比如目录下testgit里的文件(.git隐藏目录版本库除外).或者以后需要再新建的目录文件等等都属于工作区范畴. 版本库(Repository ...
- Kafka丢失数据问题优化总结
数据丢失是一件非常严重的事情事,针对数据丢失的问题我们需要有明确的思路来确定问题所在,针对这段时间的总结,我个人面对kafka 数据丢失问题的解决思路如下: 是否真正的存在数据丢失问题,比如有很多时候 ...
- FFmpeg 入门(5):视频同步
本文转自:FFmpeg 入门(5):视频同步 | www.samirchen.com 视频如何同步 在之前的教程中,我们已经可以开始播放视频了,也已经可以开始播放音频了,但是视频和音频的播放还未同步, ...