RTC程序设计:实时音视频权威指南
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2.1 一切皆比特

比特

在计算机世界里,一切复杂的数据背后,都是二进制数的0和1。在中文里,我们称这样最小的单元为1位。在英文中,对应的术语是binary digit,简称比特(bit)。

1940年,图基(John Tukey,美国,1915—2000)首次发明了缩写bit。

1948年,香农(Claude Shannon,美国,1916—2001)在著作A Mathematical Theory of Communication中使用了术语bit。

从比特的视角来理解计算机技术,可以直接洞悉问题的本质,不被编程语言的语法所困扰。

字节

将8 bit分为一组,我们定义了字节(Byte)。

1956年6月,IBM的工程师维尔纳·布赫霍尔兹(Werner Buchholz,德裔美籍,1922—2019),在IBM 7030 Stretch的早期设计阶段,首次使用了Byte这个术语,用来表示数字信息的基本单元。

最早的字节并非8 bit。《计算机程序设计的艺术》一书中的MIX机器采用6 bit作为1 Byte。8 bit的Byte约定,和IBM System/360大型机的研发有关,由其领导者布鲁克斯(Frederick P.Brooks,美国,1931—2022)推行开来。

对于单字节中的位,从左到右,我们依次编号为bit7~bit0,如图1-3所示。

img

图1-3 Byte的构成

字节是计算机世界中计量大小的基本单位,例如:1KB=1024 Byte,1MB=1024 KB,1GB=1024 MB。这里1024=210

为了方便表示二进制,人们将其4位一组,使用0~F这16个字符进行十六进制编码,如表1-2所示。

表1-2 数的进制表示

img

所以,一字节的表示范围是0~255,即十六进制的0x00~0xFF。

字节序

字节用来表示整数时,存在存储顺序的问题。

例如,0x12345678,在内存中的存储可能是0x12、0x34、0x56、0x78,也可能是0x78、0x56、0x34、0x12。前者被称为大端法(Big-Endian),后者被称为小端法(Little-Endian)。小端法表示法如图1-4所示。

img

图1-4 小端法表示法

比如,在计算机系统的本地内存中,Intel 与ARM架构常使用小端法表示法,也叫作本机序(Host Order)。而在网络传输上,人们习惯于使用大端法,即网络序(Net Order)。

又如,BMP文件使用的是小端法,而MP4文件使用的是大端法。

位序

图1-3所定义的位存储在字节内的顺序是固定的。但是我们在读取位的时候,会存在两个方向:从bit0读到bit7,或从bit7读到bit0。

例如,对于0x39=0b 00111001,从不同的方向读取,就会得到00111001或者10011100两种结果。

后面我们会看到,位序对于理解图像格式和压缩算法都是非常重要的。例如,对于PNG、GIF图像格式,位序是从bit0开始的。但是对于JPEG图像格式,位序则是从bit7开始的。

比特流与比特率

对于计算机中连续存储的字节单元,我们可以将其看作一个比特流

为了衡量信息的传递速度,我们定义比特率为每秒钟传送的比特,单位为bps(bit per second)。比特率也称为码率

表1-3反映了国际单位制SI(International System of Units)下的各种比特率单位[9]

表1-3 国际单位制SI下的各种比特率单位

img

表1-4是一些常见传输设备的比特率。

表1-4 一些常见传输设备的比特率

img

bps中的b是小写的。对于字节,用大写的B表示Byte,1 Bps=8 bps。

在音视频通话时,若带宽小于300 kbps,则我们称之为低带宽

低带宽下RTC优化标准为:纯音频最低支持60 kbps,音视频最低支持100 kbps。

Base64表示法

十六进制通过将4 bit分为一组,得到了0x00~0x0F这16种不同的值。

在早期,由于历史原因,电子邮件只允许传输英文字符数据[10]。当传输非字符数据时,网关(Gateway)会将字节中8位的最高位置为0。

为了能将二进制值用英文字符表示出来,人们设计了Base64编码

Base64编码将6 bit分为一组,并用26=64个不同的字符来表示,如表1-5所示。

表1-5 Base64编码表

img

使用A~Z、a~z、0~9、+和/,正好64个字符,来编码6 bit的一组。

由于字节是8 bit一组的,当字节数不是3的倍数时,比特数不能被6整除。

Base64编码使用等号字符=在最后做附加(padding),最终可能是3种情况:没有=,1个=,或者2个=,表示此Base64串末尾有多少个附加字节,如图1-5所示。

img

图1-5 Base64编码

例如,将0x01转换为Base64编码。

0x01对应的比特为0b00000001,由于不是3的倍数,我们将其附加2字节,得到0b 00000001 00000000 00000000,再将其6 bit一组,得到0b 000000 010000 000000 000000。查表得知,000000=A,010000=Q。因此,0x01的Base64编码为AQ==。

同理,0x01 02的Base64编码为AQI=,0x01 02 03的Base64编码为AQID。

使用Base64编码,会使原数据变长约三分之一。但好处是只使用了65个字符,便于二进制数据的文本展示。