基础实践系列之编译成iOS可用的.a静态库

比较完整的iOS编译脚本,可以一条命令执行
https://github.com/kewlbear/FFmpeg-iOS-build-script

下面来分解这条脚本的执行过程

  1. 下载FFmpeg
    http://ffmpeg.org/download.html

  2. 编写编译脚本
    主要是设置编译的参数,如下面的ffmpeg-build.sh。这个文件主要是配置编译到iOS设备的一些参数

  3. 下载gas-preprocessor.pl
    编译库需要的支持,将其拷贝到/usr/local/bin目录下
    https://github.com/mansr/gas-preprocessor 下载 perl 支持库

  4. 执行编译脚本
    下载FFmpeg后的目录名是ffmpeg。在脚本文件里指定下载的文件目录名。./ffmpeg-build.sh执行完后就会在my-ffmpeg-iOS目录下生成相应的架构的.a库

ffmpeg-build.sh 文件内容如下
(这个文件直接可以拿过去使用)

#!/bin/bash

#1、首先:定义下载的库名称
source="ffmpeg"

#2、其次:定义".h/.m/.c"文件编译的结果目录
#目录作用:用于保存.h/.m/.c文件编译后的结果.o文件
cache="cache"

#3、定义".a"静态库保存目录
#pwd命令:表示获取当前目录
staticdir=`pwd`/"my-ffmpeg-iOS"

#4、添加FFmpeg配置选项->默认配置
#Toolchain options:工具链选项(指定我么需要编译平台CPU架构类型,例如:arm64、x86等等…)
#--enable-cross-compile: 交叉编译
#Developer options:开发者选项
#--disable-debug: 禁止使用调试模式
#Program options选项
#--disable-programs:禁用程序(不允许建立命令行程序)
#Documentation options:文档选项
#--disable-doc:不需要编译文档
#Toolchain options:工具链选项
#--enable-pic:允许建立与位置无关代码
configure_flags="--enable-cross-compile --disable-debug --disable-programs --disable-doc --enable-pic"

#5、定义默认CPU平台架构类型
#arm64 armv7->真机->CPU架构类型
#x86_64 i386->模拟器->CPU架构类型
archs="arm64 armv7 x86_64 i386"

#6、指定我们的这个库编译系统版本->iOS系统下的7.0以及以上版本使用这个静态库
targetversion="8.0"

#7、接受命令后输入参数
#我是动态接受命令行输入CPU平台架构类型(输入参数:编译指定的CPU库)
if [ "$*" ]
then
    #存在输入参数,也就说:外部指定需要编译CPU架构类型
    archs="$*"
fi

#8、安装汇编器->yasm
#判断一下是否存在这个汇编器
#目的:通过软件管理器(Homebrew),然后下载安装(或者更新)我的汇编器
#一个命令就能够帮助我们完成所有的操作
#错误一:`which` yasm
#正确一:`which yasm`
if [ ! `which yasm`  ]
then
    #Homebrew:软件管理器
    #下载一个软件管理器:安装、卸载、更新、搜索等等...
    #错误二:`which` brew
    #正确二:`which brew`
    if [ ! `which brew` ]
    then
        echo "安装brew"
        ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" || exit 1
    fi
    echo "安装yasm"
    #成功了
    #下载安装这个汇编器
    #exit 1->安装失败了,那么退出程序
    brew install yasm || exit 1
fi

echo "循环编译"

#9、for循环编译FFmpeg静态库
currentdir=`pwd`
echo "当前执行编译路径" ${currentdir};
for arch in $archs
do
    echo "开始编译"
    #9.1、创建目录
    #在编译结果目录下-创建对应的平台架构类型
    mkdir -p "$cache/$arch"
    #9.2、进入这个目录
    cd "$cache/$arch"

    #9.3、配置编译CPU架构类型->指定当前编译CPU架构类型
    #错误三:"--arch $arch"
    #正确三:"-arch $arch"
    archflags="-arch $arch"

    #9.4、判定一下你到底是编译的是模拟器.a静态库,还是真机.a静态库
    if [ "$arch" = "i386" -o "$arch" = "x86_64" ]
    then
        #模拟器
        platform="iPhoneSimulator"
        #支持最小系统版本->iOS系统
        archflags="$archflags -mios-simulator-version-min=$targetversion"
    else
        #真机(mac、iOS都支持)
        platform="iPhoneOS"
        #支持最小系统版本->iOS系统
        archflags="$archflags -mios-version-min=$targetversion -fembed-bitcode"
        #注意:优化处理(可有可无)
        #如果架构类型是"arm64",那么
        if [ "$arch" = "arm64" ]
        then
            #GNU汇编器(GNU Assembler),简称为GAS
            #GASPP->汇编器预处理程序
            #解决问题:分段错误
            #通俗一点:就是程序运行时,变量访问越界一类的问题
            EXPORT="GASPP_FIX_XCODE5=1"
        fi
    fi


    #10、正式编译
    #tr命令可以对来自标准输入的字符进行替换、压缩和删除
    #'[:upper:]'->将小写转成大写
    #'[:lower:]'->将大写转成小写
    #将platform->转成大写或者小写
    XCRUN_SDK=`echo $platform | tr '[:upper:]' '[:lower:]'`
    #编译器->编译平台
    CC="xcrun -sdk $XCRUN_SDK clang"

    #架构类型->arm64
    if [ "$arch" = "arm64" ]
    then
        #音视频默认一个编译命令
        #preprocessor.pl帮助我们编译FFmpeg->arm64位静态库
        AS="gas-preprocessor.pl -arch aarch64 -- $CC"
    else
        #默认编译平台
        AS="$CC"
    fi

    echo "执行到了1"

    #目录找到FFmepg编译源代码目录->设置编译配置->编译FFmpeg源码
    #--target-os:目标系统->darwin(mac系统早起版本名字)
    #darwin:是mac系统、iOS系统祖宗
    #--arch:CPU平台架构类型
    #--cc:指定编译器类型选项
    #--as:汇编程序
    #$configure_flags最初配置
    #--extra-cflags
    #--prefix:静态库输出目录
    TMPDIR=${TMPDIR/%\/} $currentdir/$source/configure \
        --target-os=darwin \
        --arch=$arch \
        --cc="$CC" \
        --as="$AS" \
        $configure_flags \
        --extra-cflags="$archflags" \
        --extra-ldflags="$archflags" \
        --prefix="$staticdir/$arch" \
        || exit 1

    echo "执行了"

    #解决问题->分段错误问题
    #安装->导出静态库(编译.a静态库)
    #执行命令
    make -j3 install $EXPORT || exit 1
    #回到了我们的脚本文件目录
    cd $currentdir
done

2018/11/23 posted in  音视频技术

FFMPEG视音频基础探索-命令行(系列一)

ffmpeg命令行

ffplay命令行

ffprobe命令行

2018/11/21 posted in  音视频技术

UDP-RTP协议解析(基础系列六)

ftpudp

原理
RTP是基于UDP上的。即时非链接的。RTP里的载荷是媒体的分包
rtp图

2018/11/21 posted in  音视频技术

FLV封装格式解析(基础系列五)

视频封装数据

原理
flvtag

FLV封装格式是一个FLV Header文件头和一个一个的Tag组成。Tag包括音频数据以及视频数据。整个的解析过程就是将上面的图的数据进行解析。

2018/11/20 posted in  音视频技术

AAC音频码流解析(基础系列四)

AAC音频码流解析
音频码流

原理

AAC原始码流是一个一个ADTS进行分隔,同步字为0xfff
AAC码流解析的步骤就是首先从码流中搜索0x0FFF,分离出ADTS frame;然后再分析ADTS frame的首部各个字段。

AAC码流的片段

2018/11/20 posted in  音视频技术

H.264视频码流解析(基础系列三)

参考文章视音频数据处理入门:H.264视频码流解析
视频码流

可以从H.264码流中分析得到它的基本单元NALU,并且可以简单解析NALU首部的字段。通过修改该程序可以实现不同的H.264码流处理功能。

原理

H264码流
每个NALU之间通过起始码进行分隔,起始码分成两种:0x000001(3Byte)或者0x00000001(4Byte),如果NALU对应的Slice为一帧的开始就用0x00000001,否则就用0x000001。
H.264码流解析的步骤就是首先从码流中搜索0x000001和0x00000001,分离出NALU;然后再分析NALU的各个字段。本文的程序即实现了上述的两个步骤。

2018/11/20 posted in  音视频技术

音频采样数据处理(基础系列二)

20160117235313221

注:本文中声音样值的采样频率一律是44100Hz,采样格式一律为16LE。“16”代表采样位数是16bit。由于1Byte=8bit,所以一个声道的一个采样值占用2Byte。“LE”代表Little Endian,代表2 Byte采样值的存储方式为高位存在高地址中。
声音存储

2018/11/20 posted in  音视频技术

shell脚本知识梳理(一)之变量

shell变量

一:定义变量

name="rjb";

  • 定义变量时候,变量名直接定义
  • 变量名和=号之间不能有空格
  • 变量名首位不能是数字

删除变量

unset name

变量类型

  • 本地变量
    整个bash进程可以使用,name="rjb";

  • 局部变量
    当前的代码段,local name="qing";(local是关键字)

  • 环境变量
    当前shell的进程以及子进程export name="raojunbo";
    export可新增,修改或删除环境变量,供后续执行的程序使用。export的效力仅及于该次登陆操作。也即是

  • 位置变量:

//位置变量示例
name=${1};age=${2}; echo "姓名:${name} 年龄:${age}``;
执行脚本时./hello.sh  rjb  28

如下是位置变量

${0}是脚本文件名,参数是从1开始的,且在执行脚本时,参数与参数之间要有空格
${?} 表示返回上一个命令执行状态的反回值,0表示成功,1表示执行结果,2然后是错误状态吗
${#} 表示参数的个数
${*} 表示参数列表,将所有的参数组成一个字符串
${@} 表示参数列表
${$} 获取当前shell的进程id
特别说明: $?,$#,$*,$@,$$,$raojunbo 。不过书写成加{}更好区分。

使用变量

${变量名} 或者$变量名

二:字符串

区别单引号与双引号字符串

单引号里都是原样输出,双引号里

字符串拼接

   name="rjb";
    age=100;
    info="姓名:${name}年龄:${age}";
    echo $info;

    方式二
    
    
    name="rjb";
    age=100;
    info="姓名"${name}"年龄"${age};
     echo $info;    

字符串长度 ${#变量}

name="raojunbo";
echo ${#name};

字符串截取 ${变量:开始位置:结束位置}

//从1到3的子串
 name="raojunbo";   
 ${name:1:3}  
 
//从1开始直到最后
     name="raojunbo";
    ${name:1}

字符串的操作是一个比价大的话题。在具体使用时可以查相关文档。知道基本的用法就可以了。

三:数组

初始化方式

方式一:name=("404","andy","全班");
方式二:
name=();
name[0]="404"
name[1]="anddy"
name[2]="柚子

name=();
name[0]="1";
name[1]="2";

读取数组

name={"404","anddy","全部"}
echo ${name[1]}
echo ${name[@]}<!--输出所有数据-->

特别说明

@ 是一个一个输出
* 是组成一个字符串后输出 

数组长度

${#name[@]}表示取数组的全部个数,#表示取数目

#表示取长度或者数目

参数的传递

./文件名.sh 参数1 参数2 参数3

${0};表示文件名称
${1};表示参数1
${2};表示参数2
$#:表示传进来脚本的参数个数
2018/11/19 posted in  shell脚本

视频像素数据处理(基础系列一)

参考视音频数据处理入门:RGB、YUV像素数据处理

YUV处理

Y,U,V是单独存储的方式。所以很容易处理。
为节省带宽起见,大多数YUV格式平均使用的每像素位数都少于24位。主要的抽样(subsample)格式有YCbCr4:2:0、YCbCr4:2:2、YCbCr4:1:1和YCbCr4:4:4。YUV的表示法称为A:B:C表示法:
4:4:4表示完全取样。
4:2:2表示2:1的水平取样,垂直完全采样。
4:2:0表示2:1的水平取样,垂直2:1采样。
4:1:1表示4:1的水平取样,垂直完全采样。
屏幕快照 2018-11-19 下午8.04.15

RGB处理

RGB的存储存储是一个RGB一个RGB来存的。所以对于图像的处理不太好处理。
屏幕快照 2018-11-19 下午8.13.30

2018/11/19 posted in  音视频技术

英语语法梳理【总结】

一:名词

二:限定词

三:形容词

四:动词

动态构成谓语部分,谓语的构成由,实义动词,助动词(修饰实义,构成否定,疑问,时态),情态动词(修饰实义,构成情绪)。

1. 实义动词

能单独构成谓语
like,go 实际含义,是实义动词
is,are,系动词,表示“是” 的含义。(am,is,are表示“是”的系动词,是实义动词,但作为助动词使用时,没有实际的含义)
have 表示“有”,实义动词。(也可以作为助动词,表示时态)

2. 助动词be,do,have

如果be,do,have作为助动词时,不能单独做谓语,与实义动词连用用于构成各种时态,语态,语气,否定,疑问。

  • be
    am,is,are,was,were,been,being
    I am studying English. //am做助动词,构成正在进行

  • do
    does,do,done
    I do not like English.//do做助动词,构成实义动词的否定

  • have
    has,had,having
    I have studied English for 3 years. //have作为助动词,构成完成时态

3. 情态助动词

不能单独做谓语,与实义动词连用,情态助动词有其自身的词汇意义。表示可能(may),建议(shall),能力(can),必须(must),愿望(will)等,表达说话者对某种行为或者状态的看法或者态度。

  • 情态动词
    can,could,may,might,shall,should,will,would,must

  • 与上述情态动词作用一样的短语
    be able to,be going to,ought to,be supposed to ,have to ,have got to

  • 可以是情态,也可以做实义动词
    need,dare

句子类型

句子的类型划分,其实可以只是分为两类:陈述句(一般陈述,陈述否定,陈述疑问,其中,否定,疑问由助动词构成),特殊疑问句

1. 陈述句

陈述句的否定

否定,是对谓语部分做否定。

  • 实义动词做谓语,否定由do做助动词
    I like English
    I do not like English

  • 系动词做谓语,系动词+not
    he is a teacher.
    he is not a teaher.

  • 情态动词与实义复合谓语,否定在情态助动词
    he can swim.
    he can not swim.

陈述句的疑问(一般疑问句)

  • 实义动词做谓语,疑问有"do"倒装做助动词
    I like English.
    Do you like English?

  • be动词做谓语

    He is a teacher.
    Is he a teacher?

  • 情态动词做谓语

    He can swim.
    Can he swim?

2. 特殊疑问句

特殊疑问句是在一般疑问句的基础上,将要发出疑问的部分用who,what,which,when,why,how代替,然后将其放在句头。
常见的特殊疑问词:what,who,whoes,where,when,which,why,how,how much,how many,how often,how many times

  • 示例一
    he can sing in Enghlish.
    can he sign in English? //一般疑问
    who can sign in English? //特殊疑问,在一般疑问的基础上,将要问的人hewho代替,然后提到句头.

  • 示例二
    I like English.
    do you like English?//一般疑问
    What do you like ? //特殊疑问,在一般疑问的基础上,将要问的东西Englishwhat代替提到句头.

五:英语的五种基本句型

写作阅读提示:
一个完整的句子都是由两个部分组成:主语+谓语,即陈诉对象+陈诉内容;但有时意思还不够完整,所以谓语后面有时需要宾语,宾语补足语,以及状语;
在分析复杂句子时,首先找到谓语,包括主语的谓语,各个从句的谓语;
在写句子时一定要知道谓语动词的用法特点,是否能直接接宾语,接什么形式的宾语,是不定式,还是动名词作宾语;

1. 主系表

系动词:连系动词,不起作用,只是起链接作用,表征主语的特征。

  • 表特征

    feel,look,sound,taste,smell,seem,appear
    the rose doesnt smell much

  • 状态变化

    become,grow,get,turn,fall,go,come
    the teacher become angry

  • 表状态

    continue,remain,stay,keep,hold,rest,prove

  • 主系表的复杂句(思考如何从复杂句中察觉主系表)
    Vitamins are organic compounds necessary in small amounts in the diet for the normal growth and maintenance of life of animals,including man.
    分解句子,就是Vitamins are organic compounds 维他命是有机化合物

2. 主谓

  • 主谓结构的谓语动词是不及物动词;也就是不能接宾语的动词;
    the dog hatched

  • 主谓复杂句
    The trend began during the Second World War,When several governments came to the conclusion that the specific demands that a government wants to make of its scientific establishment cannot generally be foreseen in detail;

3. 主谓宾

谓语动词是及物动词,宾语是“所作用对象”;

Just like instant coffee,they want instant happiness

4. 主语 + 谓语 + 间接宾语 + 直接宾语

谓语动词是双宾动词,这种动词后面所接受的成分有人也有物。这里的人表示动作的接受者,称为间接宾语;‘物’表示动作作用的对象,是动作的承受者,称为直接宾语;
he showed the guard his passport(the guard 间接宾语,his passport 直接宾语)

5. 主语 + 谓语 + 宾语 + 宾语补足语

谓语动词是宾补动词,这种动词后面接宾语,此宾语后面又接宾语补足语。宾语和宾语补足语合起来就是复合宾语。
常见的宾补动词:appoint,believe,call,choose,consider,declare,elect,feel,find,keep,leave,make等
I very much hope that this new medium will make my Christmas message more personal and direct.

6. 从简单句到复合句

宏观结构层面,以点带面的贯穿从句(名,定,状)与谓语(时态,情态,虚拟)

主语-----句子充当主语---主语从句
宾语-----句子充当宾语---宾语从句
表语-----句子充当表语---表语从句
同位语----句子充当同位语---同位语从句

定语-----句子充当定语-----定语从句【定语即限定,一般是形容词做限定与修饰,所以又叫形容词从句】
状语-----句子充当状语-----状语从句【状语即一般是副词,修饰动词,形容词,副词,表示动词,形容词,副词的状态,用作状语】

六:英语时态

1. 一般进行时态

2. 正在进行时态

3. 一般将来时态

4. 完成时态

5. 完成进行时态

6. 虚拟语气

七:名词从句

名词从句就是用三种句子(陈述句,一般疑问句,特殊疑问句)来分别充当另外一个句子的句子成分。这三种句子放在另一个句子中要做各种变化调整

1. 简单与与名词从句关系

1. 陈述句作为句子成分

  1. 当把一个完整的陈述句当做名词来使用时,需要在陈诉句首加上that,使用that+陈述句充当句子的成分。
  2. 加上that主要是为了标记它所修饰的部分是从句,而并非句子的核心。
  3. 宾语从句有时that可以省略(具体在什么情况下可以省略?)

2. 一般疑问句作为句子成分

将一个一般疑问句当做名词使用时,需要先将疑问句倒装语序变成陈述语句语序。并在句首加上weather或者if来引导。
一般疑问句:will he come to my party?
名词从句:Whether he will come to my party makes no difference to my party。

3. 特殊疑问句作为句子成分

将一个特殊疑问句当做名词使用时,需要先将疑问句倒装成陈述句语序,然后分别充当另一句子的主语,宾语,表语,同位语成分。
Why did dinosaurs become extinct?
Why dinosaurs became extinct is staill a mystery.

2. 主语从句

1. 陈述句做主语

  • 示例一
    That the seas are being overfished has been known for years.
    that引导the sea are being overfished做主语

  • 示例二(It is 过去分词 that)
    It is reported that 据报道
    It is believed that 人们相信
    It is generally thought that 人们普遍认为
    It must be pointed that 必须指出的是

  • 示例三(It is 形容词 that)
    It is clear that
    It is possible that
    It is natural that

  • 示例四(It is 名词 that)
    It is a fact that
    It is a good thing that

2. 一般疑问句做主语

Whether he comes or not makes no difference to me.

3. 特殊疑问句作主语

What he told you is true
When the meeting is to be held has not yet been decided.

3. 宾语从句

1. 陈述句做宾语

What know (that) the world is round.

2. 一般疑问句作宾语

I do not know if he needs my help.
No one knew whether or not interest rates would rise.

3. 特殊疑问句作宾语

I have not decide whom I should vote for.
No one knows exactly how speech began.

4. 表语从句

1. 陈述句做表语

My idea is that the child should be send to school.

2. 一般疑问句作表语

My concern is whether he comes or not.

3. 特殊疑问句作表语

Monery is what we are badly in need of.

5. 同位语从句

同位语:用来补充说明名词的成分,当用一个完整的句子来补充说明名词时。
结构:名词+ 连词+ 同位语。

1. 陈述句做同位语

The fact that he succeeded in the experiment pleased everybody.

2. 一般疑问句做同位语

They are faced with the problem whether they should continue to work.

3. 特殊疑问句作同位语

The question who should go abroad on this business tour requires consideration.

八:定语从句

九:状语从句

//不定式是什么,动名词是什么?分词是什么?,非谓语是什么?

十二:不定式

十三:动名词

十四:分词

十五:从句与非谓语

2018/11/16 posted in  英语能力