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

执行脚本.png

Snip20160827_4.png
- # ***********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 加群领取哦~


Snip20160827_5.png
- // 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
- // 定义文件目录
- 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
- # 每个脚本都应该在文件开头加上set -e
- # 用来控制脚本执行,只要有一行语句的执行出错就会退出。
- set -e
echo_ffmpeg_version函数功能::打印IJK_FFMPEG_COMMIT这个变量值- # 定义函数【echo_ffmpeg_version】
-
- function echo_ffmpeg_version() {
- # 输出 ffmpeg版本号
- echo $IJK_FFMPEG_COMMIT
- }
- # 定义函数【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
- }
这个脚本用于获取B站托管的github上的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 -
- }
- # 定义函数【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
- }
- # 逻辑分支语句
- # 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脚本作用 :用于下载B站托管的github上的FFmpeg分支源码和FFmpeg依赖包- // 下载远程代码的地址
- // 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

Snip20160827_1.png
https://github.com/Bilibili/gas-preprocessor.git extra/gas-preprocessor 或者 git clone https://github.com/Bilibili/FFmpeg.git extra/ffmpeg
执行脚本后.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脚本作用:下载B站托管的github上的FFmpeg分支,分别根据不同的架构平台创建对应的目录,把ffmpeg源码放置不同架构平台的工作目录中- // 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

执行pull-repo-ref.sh脚本前.png
git clone --reference extra/ffmpeg https://github.com/Bilibili/FFmpeg.git ios/ffmpeg-平台版本
执行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