目录

  • 一、音视频如何采集和表示
    • 1、音视频录制原理
    • 2、音视频播放原理
  • 二、视频基础概念
    • 1、图像基础概念
    • 2、RGB、 YUV深入讲解
    • 3、RGB和YUV的转换
    • 4、YUV Stride对齐问题
  • 三、视频为什么要做编码
  • 四、音频基础概念
    • 1、基本概念
    • 2、声音的物理性质-频率-音频采样率
    • 3、数字声音的表示
    • 4、音频主要概念
  • 五、封装格式基础
    • 1、封装格式的概念
    • 2、常见的音视频封装格式
  • 六、音视频进阶需要学习什么项目
  • 七、流媒体开发需要懂C/C++Linux吗

一、音视频如何采集和表示

1、音视频录制原理

2、音视频播放原理

二、视频基础概念

1、图像基础概念

◼ 像素: 像素是一个图片的基本单位, pix是英语单词picture的简写, 加上英语单词“元素element”, 就得到了“pixel”, 简称px, 所以“像素”有“图像元素”之意。◼ 分辨率: 是指图像的大小或尺寸。 比如1920x1080。◼ 位深: 是指在记录数字图像的颜色时, 计算机实际上是用每个像素需要的位深来表示的。 比如红色分量用8bit。◼ 帧率: 在1秒钟时间里传输的图片的帧数, 也可以理解为图形处理器每秒钟能够刷新几次。 比如25fps表示一秒有25张图片。◼ 码率: 视频文件在单位时间内使用的数据流量。 比如1Mbps。◼ Stride: 指在内存中每行像素所占的空间。 为了实现内存对齐每行像素在内存中所占的空间并不一定是图像的宽度。

(1)像素
像素是一个图片的基本单位, pix是英语单词picture的简写,加上英语单词“元素element”,就得到了**“pixel”**,简称px,所以“像素”有“图像元素”之意。

  例如2500×2000的照片就是指横向有2500个像素点,竖向有2000个像素点,总共是500万个像素,也俗称500万像素照片。

(2)分辨率
 图像(或视频)的分辨率是指图像的大小或尺寸。我们通常用像素表示图像的尺寸。例如2500×2000的照片就是指横向(宽)有2500个像素点,竖向(高)有2000个像素点。

常见的分辨率:360P(640x360)720P(1280x720)1080P(1920x1080)4K(3840x2160)8K(7680x4320)

  常说的 1080 和 720 其实是指垂直像素数,分辨率除去垂直像素,还需要考虑到水平像素数
 按照 16:9 (宽 : 高) 的比例计算, 720p 的水平像素数为 720 ÷ 9 × 16 = 1280,总计像素为921600像素即大约为 92 万像素。

  1080p 具有 1920 个水平像素,总计2073600像素即约 200 万像素,是 720p 的两倍多。

  低分辨率 -》高分辨率 提升清晰度,像素越多视频就越清晰,所以 1080p 比 720p 的视频更加清晰。 图像的分辨率越高,图像就越清晰


 有些网站的分辨率显示是 720i 和 1080i,这个 i 又指的是什么?同样都是1080,1080i 和 1080p 哪个会更清晰?
i 和 p 是指扫描方式, i 表示隔行扫描(Interlaced), p 则表示逐行扫描(Progressive),以 1080 的视频举例:

1080i: 1920 x 1080 分辨率。隔行扫描模式下的高清图像是隔行显示的。每一个奇数行图像都在每一偶数行图像后面显示出来。比如将 60 帧分成两部分,奇数帧只扫描1,3,5,7,9… 行,偶数帧只扫描 2,4,6,8,10… 行。理论上人眼是察觉不出来画面不连续,反而是由于视觉残留,能自动将两帧叠加在一起。◼ 1080p: 1920x1080 分辨率。和 1080i 的区别就在于 1080p 不是隔行扫描,是逐行扫描。每一线都同时表现在画面上,因此比隔行扫描电视更加的平滑。

逐行扫描和隔行扫描的不同可以从含义和显示效果两方面理解:1.含义上的区别  逐行扫描也称为非交错扫描,通过扫描每行像素,在电子显示屏上“绘制”视频图像,每一帧图像由电子束顺序地一行接着一行连续扫描而成。  隔行扫描也就是交错扫描,最终是把每一帧图像通过两场扫描完成。2.显示效果的区别  逐行扫描克服传统扫描方式的缺陷,运动检测和运动补偿功能更加完善,并且显示稳定性比隔行扫描强,动态失真程度低。  隔行扫描有着较高的刷新率,改善了运动中物体的外观,空间分辨率比逐行扫描更高。

(3)位深

我们看到的彩色图片,都有三个通道,分别为红®、 绿(G)、蓝(B)通道。(如果需要透明度则还有alpha分量)

  通常每个通道用8bit表示, 8bit能表示256种颜色,所以可以组成 256x256x256=16777216 = 1677万种颜色。这里的8bit就是我们讲的位深。

  每个通道的位深越大,能够表示的颜色值就越大,比如现在高端电视说的10bit色彩,即是每个通道用10bit表示,每个通道有1024种颜色。

  1024x1024x1024约为107374万色, 是8bit的64倍。常见的颜色还是8bit居多。

(4)帧率
 帧率即 FPS(每秒要多少帧的画面),经常玩游戏的同学应该会对这个词很熟悉。我们玩游戏时, FPS 帧率越高就代表游戏画面越流畅,越低则越卡顿。视频也是如此。

电影帧率一般是 24fps(帧每秒);电视剧一般是25fps; -> 现在的电视机可以 支持120帧监控行业常用 25fps;音视频通话常用15fps;

  帧率越高,画面越流畅,需要的设备性能也越高。

(5)码率

◼ 视频文件在单位时间内使用的数据流量。比如1Mbps。◼ 大多数情况下码率越高 分辨率越高,也就越清晰。但模糊的视频文件码率大小也可以很大,分辨率小的视频文件可能也比分辨率大的视频文件清晰。◼ 对于同一个原始图像源的时候,同样的编码算法,则码率越高,图像的失真就会越小,视频画面就会越清晰


(6)Stride跨距
Stride : 指在内存中每行像素所占的空间。为了实现内存对齐每行像素在内存中所占的空间并不一定是图像的宽度。

◼ Stride 就是这些扩展内容的名称, Stride 也被称作 Pitch,如果图像的每一行像素末尾拥有扩展内容, Stride 的值一定大于图像的宽度值,就像下图所示:◼ 比如分辨率638x480的RGB24图像,我们在内存处理的时候如果要以16字节对齐,则638*3/16=119.625不能整除,因此不能16字节对齐,我们需要在每行尾部填充6个字节。就是640*3/16=120。此时该图片的stride为1920字节。

RGB888一个像素点三个字节,R/G/B各占一个字节

2、RGB、 YUV深入讲解

◼ RGB: 红R、 绿G、 蓝B三基色。◼ YUV: “Y”表示明亮度(Luminance或Luma),也就是灰阶值,“U”和“V”表示的则是色度(Chrominance或Chroma)。◼ 通常的图像像素是按RGB顺序进行排列, 但有些图像处理要转成其他顺序,比如OpenCV经常转成BGR的排列方式。

◼ 与我们熟知RGB类似, YUV也是一种颜色编码方法, 它是指将亮度参量(Y:Luminance或Luma) 和色度参量(UV: Chrominance或Chroma) 分开进行表示的像素编码格式。Luminance:亮度 Chrominance:色度◼ 这样分开的好处就是不但可以避免相互干扰, 没有UV信息一样可以显示完整的图像,因而解决了彩色电视与黑白电视的兼容问题;还可以降低色度的采样率而不会对图像质量影响太大, 降低了视屏信号传输时对频宽(带宽) 的要求。

◼ YUV是一个比较笼统地说法, 针对它的具体排列方式, 可以分为很多种具体的格式:◼ 打包(packed) 格式:将每个像素点的Y、 U、 V分量交叉排列并以像素点为单元连续的存放在同一数组中, 通常几个相邻的像素组成一个宏像素(macro-pixel)◼ 平面(planar) 格式: 使用三个数组分开连续的存放Y、 U、 V三个分量, 即Y、U、V分别存放在各自的数组中。


◼ YUV采用A:B:C表示法来描述Y,U,V采样频率比例, 下图中黑点表示采样像素点Y分量,空心圆表示采样像素点的UV分量。 主要分为 YUV 4:4:4、 YUV 4:2:2、 YUV 4:2:0这几种常用的类型◼ 4:4:4 表示色度频道没有下采样, 即一个Y分量对应着一个U分量和一个V分量。◼ 4:2:2 表示 2:1 的水平下采样,没有垂直下采样,即每两个Y分量共用一个U分量和一个V分量。◼ 4:2:0 表示 2:1 的水平下采样, 2:1 的垂直下采样,即每四个Y分量共用一个U分量和一个V分量。






3、RGB和YUV的转换

◼ 通常情况下RGB和YUV直接的相互转换都是调用接口实现, 比如Ffmpeg的swscale或者libyuv等库。◼ 主要转换标准是 BT601 和 BT709。8bit位深的情况下◼ TV range是16-235(Y)16-240(UV) , 也叫Limited Range◼ PC range是0-255,也叫Full Range◼ 而RGB没有range之分,全是0-255YUV(256 级别) 可以从8位 RGB 直接计算:Y = 0.299*R + 0.587*G + 0.114*B;U = -0.169*R - 0.331*G + 0.5 *B ;V = 0.5 *R - 0.419*G - 0.081*B;反过来, RGB 也可以直接从YUV (256级别) 计算:R = Y + 1.402 (Y-128)G = Y - 0.34414 (U-128) - 0.71414 (U-128)B = Y + 1.772 (V-128)◼ 从YUV 转到 RGB 如果值小于0要取0,如果大于255要取255
RGB和YUV的转换-为什么解码出错显示绿屏?因为解码失败时YUV分量都填为0值,然后根据公式:R = 1.402 * (-128) = -126.598G = -0.34414*(-128) - 0.71414*(-128) = 44.04992 + 91.40992 = 135.45984B = 1.772 * (-128) = -126.228RGB 值范围为[0255], 所以最终的值为:R = 0G = 135.45984B = 0此时只有G分量有值所以为绿色。YUV -> RGB

4、YUV Stride对齐问题

  比如分辨率638×480的YUV420P图像,我们在内存处理的时候如果要以16字节对齐,则638不能被16整除,我们需要在每行尾部填充2个字节。就是640。此时该图片的Y stride为640字节。

三、视频为什么要做编码

◼ 一张为720x480的图像,用YUV420P的格式来表示,其大小为: 720*480*1.5 约等于 0.5MB。◼ 如果是25帧, 10分钟的数据量 0.5M*10*60*25 = 7500MB -> 7GB多◼ 视频编码压缩的目的是降低视频数据大小,方便存储和传输

为什么压缩的原始数据一般采用YUV格式” />

四、音频基础概念

1、基本概念

◼ 声音是一种由物体振动引发的物理现象,如小提琴的弦声等。物体的振动使其四周空气的压强产生变化,这种忽强忽弱变化以波的形式向四周传播,当被人耳所接收时,我们就听见了声音。

◼ 声音是由物体的振动产生的,这种振动引起了周围空气压强的振荡,我们称这种振荡的函数表现形式为波形.

2、声音的物理性质-频率-音频采样率

◼ 声音的频率是周期的倒数,它表示的是声音在1秒钟内的周期数,单位是赫兹(Hz)。千赫(kHz),1000Hz, 表示每秒振动1000次。声音按频率可作如下划分:◼ 次声 020Hz◼ 人耳能听见的声音 20Hz~ 20KHz采样定理,两倍频率去采集,采集后可以再去还原出来的声音。◼ 超声 20KHz~ 1GHz◼ 特超声 1GHz~ 10THz麦克风采集模拟世界20kh-》AD-》计算机采样2倍的20khz,48khz、44.1khz-》DA转换-》喇叭播放

3、数字声音的表示

  现实中我们听到的声音是连续波的,但是在计算机中只能通过采样来复原波形。20khz 基本上是到顶 (采样定理, *2倍,所以 CD音质>40khz)

◼ 假设常用的采样频率44100,采样深度16bit,2通道(声道),采集4分钟的数据44100*16*2*4*60= 338688000bit338688000/8/1024/1024 = 40M字节打电话是 深度为8bit的声音,不悦耳, 及时对方放歌曲也不动听。◼ 没有经过压缩的音频数据我们叫PCM数据。PCM(Pulse Code Modulation,脉冲编码调制)音频数据是未经压缩的音频采样数据裸流,它是由模拟信号经过采样、量化、编码转换成的标准数字音频数据。

4、音频主要概念

◼ 采样频率: 每秒钟采样的点的个数。常用的采样频率有:2200022kHz):无线广播。4410044.1kHz): CD音质。4800048kHz):数字电视, DVD。9600096kHz):蓝光,高清DVD。192000(192kHz):蓝光,高清DVD。◼ 采样精度(采样深度) :每个“样本点”的大小常用的大小为8bit, 16bit, 24bit。浮点数表示,整数表示。浮点表示 -1~1整数(深度为16), -32768~32767 -> 除于32768 --1~1范围◼ 通道数: 单声道,双声道, 3声道,四声道, 6声道。   声道布局(channel layout):立体声(左右声道)、低音炮(2.1声道)5.1 环绕立体声◼ 比特率: 每秒传输的bit数,单位为: bps(Bit Per Second)。间接衡量声音质量的一个标准。没有压缩的音频数据的比特率 = 采样频率 * 采样精度 * 通道数。◼ 码率: 压缩后的音频数据的比特率。常见的码率:96kbps: FM质量128-160kbps:一般质量音频。192kbps: CD质量。256-320Kbps:高质量音频码率越大,压缩效率越低,音质越好,压缩后数据越大。码率 = 音频文件大小/时长◼ 帧: 音频的帧的概念没有视频帧那么清晰, 几乎所有视频编码格式都可以简单的认为一帧就是编码后的一张图像。◼ 帧长:(1) 可以指每帧采样数播放的时间, mp3 1152个采样点,每帧则为 24ms; aac则是每帧是1024个采样点。 攒够一帧的数据才送去做编码(2) 也可以指压缩后每帧的数据长度。 所以讲到帧的时候要注意他适用的场合。每帧持续时间() = 每帧采样点数 / 采样频率(HZ)◼ 交错模式: 数字音频信号存储的方式。数据以连续帧的方式存放,即首先记录帧1的左声道样本和右声道样本,再开始帧2的记录...◼ 非交错模式: 首先记录的是一个周期内所有帧的左声道样本,再记录所有右声道样本MP3AACOPUS webrtcAC3和EAC3 杜比公司的方案 交钱

五、封装格式基础

1、封装格式的概念

  封装格式(也叫容器) 就是将已经编码压缩好的视频流、音频流及字幕按照一定的方案放到一个文件中,便于播放软件播放。

  一般来说,视频文件的后缀名就是它的封装格式。封装的格式不一样,后缀名也就不一样。

  比如:同样的陷可以做成饺子也可以做成包子。对于视频也是一个道理,同样的音视频流可以用不同容器来承载。

这里的压缩算法:视频Video: 使用了H264/AVC压缩算法音频Audio: 使用了AAC压缩算法封装则使用MP4封装格式

2、常见的音视频封装格式

AVI、 MKV、 MPE、 MPG、 MPEGMP4、 WMV、 MOV、 3GPM2V、 M1V、 M4V、 OGMRM、 RMS、 RMM、 RMVB、 IFOSWF、 FLV、 F4V、ASF、 PMF、 XMB、 DIVX、 PARTDAT、 VOB、 M2TS、 TS、 PS

  FLV > mp4 > TS
H264+AAC封装为FLV或MP4是最为流行的模式

六、音视频进阶需要学习什么项目


 除了上图还有live555也是不错的开源学习项目,不过这是用C++写的。

七、流媒体开发需要懂C/C++Linux吗

  坦白来说,需要也不需要,看你是基于什么方向去做,如果是基于硬件方案比如海思SDK,那就只用C,但是有时候也需要做一些纯软件的开发,这时候一般会用到C++,因为开发起来高效而且有许多开源的项目可以借鉴!

  总而言之,多会一门技能对自己只有好处,没有坏处,从个人长远的技术发展角度来看也是有利的!