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

news2024/9/29 21:19:37

前言

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

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 : 是目录就为真
【学习地址】: FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发
【文章福利】:免费领取更多音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击 1079654574 加群领取哦~

二、分析【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站的分支仓库时就可以将之前下好的官方仓库的本地库作为参考仓库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/55329.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java高校学生社团管理系统n4pcu

要开始我们毕业设计的第一步的关键就是选好我们的课题,有的同学开始选题的时候想着按照传统的课题延续下去,在设计题目时,不要过于笼统广泛,选择题目其实并不难,要多从自身的角度出发,要结合你们当前所处的…

VTK网格细分-vtkAdaptiveSubdivisionFilter

欢迎大家加入社区,雪易VTK社区-CSDN社区云 前言:此博文主要分享VTK中关于细分网格的相关Filter,同时希望能给其他小伙伴一些帮助。 小结:VTK中关于网格细分的Filter包括vtkSubdivisionFilter和vtkAdaptiveSubdivisionFilter。其…

【服务器数据恢复】EMC Unity存储误操作删除数据卷的数据恢复案例

服务器数据恢复环境: EMC Unity某型号存储; 存储设备连接的2台硬盘柜上共创建2组独立的POOL; 2组POOL共包含21块520字节的硬盘。 服务器故障&检测: 误操作删除了2组POOL上的部分数据卷,和用户沟通后得知有5个数据…

Linux学习记录——사 权限与工具

目录的权限 想要进入一个目录,必须有x权限。对于目录来讲,r权限代表着可以查看当前目录下的文件名属性,w权限代表着可以在该目录下创建新文件。 默认权限 现在创建一个目录和文件 创建普通文件时(不包括可执行)&…

冬天这么冷,到底要不要坚持送孩子入托?

进入初冬,天气转凉,很多家长担心宝宝着凉感冒,不送孩子去托班了,甚至干脆不带孩子出门。 事实上,无论从幼儿身体健康发育的角度,还是心理发展的层面,这种做法都是极不科学的。 看看下面这些理由…

[Java]图论详解(内附详细代码)

专栏简介 :MySql数据库从入门到进阶. 题目来源:leetcode,牛客,剑指offer. 创作目标:记录学习MySql学习历程 希望在提升自己的同时,帮助他人,,与大家一起共同进步,互相成长. 学历代表过去,能力代表现在,学习能力代表未来! 目录 1.图的基本概念 2.图的存储结构 2.1 邻接矩阵…

[Linux]------线程控制与互斥

文章目录前言一、进程VS线程空间共享二、线程控制POSIX线程库创建线程获取线程IDpthread_join线程异常第二个参数线程的局部存储线程的分离exit()三、线程的互斥进城线程间的互斥相关背景概念互斥量mutex模拟抢票逻辑解决问题互斥量实现原理探究基于RAII机制锁的模拟实现四、可…

Linux 线程控制 —— 线程清理 pthread_cleanup_push

主线程可以通道 pthread_cancel 主动终止子线程,但是子线程中可能还有未被释放的资源,比如malloc开辟的空间。如果不清理,很有可能会造成内存泄漏。 // 子线程回调函数 void* thread_run(void* args) {int* p (int*)malloc(100); // 动…

中小企业选择ERP系统时应关注的10个关键功能

现代ERP系统是帮助企业实现提高生产力、增加盈利能力和提高竞争力的目标的好帮手。该类软件旨在满足中小企业不断增长的业务需求,可确保整个企业的健康发展。 每天都有新的ERP功能和应用程序进入市场,如何明智选择至关重要。以下是中小企业在选择现代ERP…

Elasticsearch_第2章_ elasticsearch基础

Elasticsearch_第2章_ elasticsearch基础 文章目录Elasticsearch_第2章_ elasticsearch基础0.学习目标1.DSL查询文档1.1.DSL查询分类1.2.全文检索查询1.2.1.使用场景1.2.2.基本语法1.2.3.示例1.2.4.总结1.3.精准查询1.3.1.term查询1.3.2.range查询1.3.3.总结1.4.地理坐标查询1.…

SSM+JSP实现《吃货联盟外卖系统》

🍅程序员小王的博客:程序员小王的博客 🍅程序员小王的资源博客:http://wanghj.online/ 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 如有编辑错误联系作者,如果有比较好的文章欢迎…

上海亚商投顾:沪指冲高回落 纺织服装股午后集体走强

上海亚商投顾前言:无惧大盘大跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 市场情绪沪指今日缩量震荡,以中字头为首的权重股走低,上证50午后一度跌近1%,创业板指较为…

秋招|阿里测试开发岗面经(一共七次面试)

三月份的时候投了阿里的实习,然后基本上是一周面一次,前前后后一个月。实习通过了,但是后面因为有事,所以没能去成暑期实习,部门leader人很好,说是可以在秋招的时候再补上终面,于是就有了一共七…

jQuery easyui源码赏析

引子 jQuery未过时,在一些中小网站中,jQuery还是发挥着瑞士军刀的作用。我们不能为了前后端分离而分离,一些很简单的需求,很简单的页面,freemarkerjQuerybootstrap就能搞掂,奈何一定要搬动vue和react这些大…

[附源码]计算机毕业设计影评网站系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

【雷达回波】基于matlab天气观测极化雷达回波仿真【含Matlab源码 2252期】

⛄一、天气观测极化雷达回波仿真简介 本示例展示了如何模拟满足天气观测要求的极化多普勒雷达回波。雷达在天气观测、灾害检测、降水分类和量化以及预报方面发挥着关键作用。此外,极化雷达以前所未有的质量和信息提供多参数测量。此示例演示如何模拟扫描分布式天气…

Java项目:ssm+jsp实现手机WAP版外卖订餐系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 这是一款由jspssm框架(spring、springMVC、mybaits)实现的手机WAP版外卖订餐系统。 本系统前台页面是手机端的&#xf…

如何发布一个 npm 包

前言 npm(node package manager)作为 Node.js 的包管理工具,让世界各地的 JavaScript 开发者方便复用、分享代码以及造轮子;本文将介绍如何发布一个 npm 包,以及使用工具来自动化管理发布 npm 包;本文总览…

Java代码审计——WebGoat CSRF (上)

目录 前言: (一)CSRF 0x01、简单介绍 0x02、实际案例 1.对 Referer 过滤不严导致的 CSRF 漏洞 2.token 可重用导致 CSRF 漏洞 3、webGoat中的CSRF 0x03 防御 3.1 STP 3.2 检查 Referer 字段 3.3 检查 Referer…

GMO Research 2022年旅游调查:旅游业有望强劲增长

GMO Research (TOKYO: 3695)最近进行的一项旅行调查显示,随着边境再次开放,亚洲正在逐渐恢复正常的旅行模式。尽管该地区仍没有达到疫情前水平,旅行者仍持谨慎态度,但他们对海外旅行的兴趣显著增加。 为了解旅行模式和旅行意愿&a…