从零开始音视频

作者 | 翁鹏

 42

什么是视频?

视频是利用人眼视觉暂留的原理,也就是一张张连续的图片,图片切换的非常快我们的眼睛跟不过来就感觉非常的流畅没有图片切换的卡顿。

图片

视频其实是一张张图片组成的,但是电脑怎么理解图片呢?如果将图片放大就可以看到一个个的小方块,那就是一个像素其中就包含了它的颜色信息。

常用的颜色编码就是 RGB 一个像素大小为 24bit 其中红绿蓝各占 8bit,控制红绿蓝三种颜色的比例就可以表示 16777216种颜色。除了 RGB 还有 ARGB 32 它包含了 alpha 通道信息也就是透明度,一个像素需要 32bit 大小。

YUV

另一种常用的颜色编码是 YUV 也可以称为 YCbCrY 代表亮度,U(Cb)表示蓝色分量(蓝色通道与亮度的差值),v(Cr) 表示红色分量(红色通道与亮度的差值),电视就是使用 YUV 编码,为了兼容黑白电视,因为 YUV 其中的 Y 包含了整个图片的亮度信息它可以直接输出黑白图片。

YUV 也分为很多格式,如 YUV422 YUV420 等,其中最常用的是 YUV420,它表示每采集 4 个 Y 就采集 1 个 U 和 v,平均下来 1 个像素就占 12bit 是 rgb 的一半,它就是利用了人眼对亮度比较敏感对颜色比较麻木的特性减少体积,一般手机摄像头拍出来就是 YUV420 格式。

YV12 I420 YU12 NV12 NV21 都是 YUV420YV12 I420 也称为 YUV420P(P 表示平面格式),它们的区别是 U V 储存顺序不同。网络上的视频一般都是 YUV420P

I420: YYYYYYYY UU VV  => YUV420P
YV12: YYYYYYYY VV UU  => YUV420P
NV12: YYYYYYYY UVUV   => YUV420SP
NV21: YYYYYYYY VUVU   => YUV420SP

分辨率

大多数电脑屏幕的分辨率是 1920x1080 这代表横向有 1920 个像素乘以纵向有 1080 个像素。

1920x1080 称为 Full HD1280x720称为 HD ,2560x1440 称为 2k,这些是 16:9 电视的标准。

视频画质 1080p 是代表纵向有多少行像素,这里的 p 代表是逐行扫描。还有 1080i 这里的 i 是代表隔行扫描,一帧画面分为奇数行和偶数行,这是以前电视台为了提升清晰度想出的办法,让相同的带宽下清晰度更高。

k 其实代表横向大约有几个 1024 列像素。比如 1111x9876 可以称为 1k(或1.1k)或 9876p

1 秒钟切换的图片数量我们用 fps 表示,代表 1 秒钟切换多少张图片。一般来说 24fps 就满足人眼,电影一般都是 24 帧。但是玩游戏 30fps 都卡,为什么 24fps 的电影那么流畅而游戏却那么卡呢?

那是因为电影都是模糊帧它是在拍摄时一帧就包含了物体在这一帧时间内的动作,比如拿手机长曝光路上的汽车。而游戏是实时渲染出来的每一帧都和前后帧没有位移关系,而且不同帧之间的渲染时间可能也不相同。这也是为什么交互动画,游戏都要追求 60fps

29.97 这种奇怪的帧数。是因为以前美国从黑白电视到彩色电视时,因为多了彩色信号,电视频段塞不下去这些信息。所以就在帧率上做了手脚,并且这个规范沿用至今。现在很多设备还是使用当时的规范。

视频容器

mp4 大家都知道是视频格式,但其实它是一种封装格式也可以叫做容器,因为它是将 视频 音频 字幕 元信息 ... 等信息封装起来的一种容器,其中的视频就是经过编码过的视频。

视频容器和视频编码是多对多的关系,一个视频格式可以使用多种视频编码,一个视频编码也可以放进多种视频容器。

比如 mp4 可以使用 h.264 h.265 等编码,avi 可以使用 h.264 MPEG-2 等编码,TS/PS 可以使用 h.264 MPEG-2 MPEG4 等编码,大多数容器都支持 h.264编码。

视频格式其实是一个容器,所以视频格式转换可以直接使用 MediaCoder 这类工具直接转换编码相同的格式,因为两种视频格式使用的是相同的编码所以转换速度非常快。

在 ffmpeg 中想保持输出的视频和输入的视频使用相同的编码时,可以使用 -c copy参数,表示直接复制视频和音频编码。可以加速视频转换。

但是对于 WebM 这类 VP8 VP9 编码的视频转 mp4 这种 H.264 编码的视频,就只能使用转码工具慢慢转了。

视频编码

编码也有很多的格式,现在主流的分为 h.26x 和 vpx 两大派系,其中 h.26x 派的 h.264(又称MPEG-4第10部分,高级视频编码) 最常用。

视频编码主要是为了压缩视频,一个 1080p60fps 的视频 1 个像素算 3 字节的话,那么 1 分钟的视频就需要 20G 的空间!h.264 的压缩比大约是 1:100 也就是上面的视频经过压缩就只有 200M

H.264

H.264 是现在做流行的视频编码,几乎所有设备都支持这种编码。它是由国际电信联盟通电信标准部 (ITU-T) 和国际标准化组织/国际电工委员会动态图像专家组 (ISO/IEC MPEG) 共同开发的一种视频压缩技术。

vpx

2010 年谷歌收购了 On2 和其下的所有视频压缩技术。vp8 是 On2 最先进的视频压缩技术,收购后谷歌就宣布 vp8 永久免费。主要为网络环境设计,它的压缩能力并不输 h.264 。WebM 时谷歌基于开源容器格式 Matroska 开发的容器格式,用以封装 VP8 编码的视频和 Vorbis 编码的音频。

vp9 是谷歌开发用来替换老的 vp8 编码,它常与 Vorbis 或 Opus 音频编码一起使用。

帧内压缩

对于 h.264 这类现代编码格式,视频压缩分为帧内压缩和帧间压缩,帧内压缩就是将每一张图片压缩成 jepg 这种有损图像。

帧间压缩

帧间压缩其实就是图片之间变化其实都太小了,我们只要保存关键帧和它们之间的运动的物体轨迹然后智能预测就好了,根本不需要记住中间完整的图像,两个关键帧之间的帧就称为预测帧。

h.264 中就有 I帧(关键帧) P帧(前向预测帧) 和 B帧(双向预测帧) 的概念,前向预测帧就是这一帧需要知道前一帧的信息才能渲染出来,双向预测是在 I帧 和 P帧 的基础上再预测,就是要同时只要它前一帧和后一帧才能推出这一帧的图像信息。

GOP

GOP 是一组连续的画面它由一张I帧 和多张P帧/B帧 组成(一个 I帧 过后要经过多少帧才能碰到下个 I帧),它是编码器和解码器存取的基本单位,表示每一组 IPB帧 序列包含多少帧。

GOP 的值越大那么视频的模拟出来的 P/B帧的数量也就更多,同码率下的 GOP 越大视频质量就越高。

IDR 帧

IDR帧 是 I帧 的子集,解码器解码到 IDR帧 时,会立即将参考帧队列清空,并将已解码的数据全部输出或抛弃。重新查找参数集,开始一个新的序列。这样如果前一个序列出现重大错误,在这里可以获得重新同步的机会。IDR帧 图像之后的图像永远不会使用 IDR帧 之前的图像的数据来解码。

码率

码率(比特率)表示视频每秒的数据量,它使用比特每秒(bit/sbps)为单位。码率决定了视频大小,也就间接决定视频质量。

主要有三种控制码率的方法 CBR 固定码率VBR 可变码率 和 CRF 固定质量

  • CBR 是全程使用固定码率,每秒的数据量是可以知道的,常用与直播,编码压力小。

  • VBR 是动态码率,它会为简单的场景使用更小的码率,比如静止不动的画面,而复杂的场景使用更高的码率,它按需分配大大的减少了空间占用。

  • CRF 是以画质为目标,不考虑码率和文件大小,它也会和 VBR 一样最大化利用资源,但是最终的文件大小是不可以预期的。

什么是音频?

我们说话时,发出的声音震动空气,让空气产生变化形成一种波,就是声波。声音的频率一般会以赫兹表示,记为 Hz,指每秒钟周期性震动的次数。1Hz 就是一秒震一次。人耳识别范围是 20Hz 到 20000Hz,低于 20Hz 称为次声波,高于 20kHz 称为超声波。

和视频的帧率一样的道理,声音也有一个频率,叫做采样率,因为人耳识别最大频率是 20kHz 所以 22050 赫兹采样率很常用,一般用于无线电广播。8kHz 多用于电话,44100Hz 就是 CD 音质,96000 - 192000 Hz 就是蓝光 HD-DVD 的采样率。

除了采样频率还有采样大小,一般分为 8bit 和 16bit,一般 16bit 用于双声道,8bit 用于单声道,当然也有反过来的 16bit 的单声道和 8bit 双声道。采样的大小决定了采样精度 8bit 只能将振幅划分成 256 个等级,16bit 是 6553632bit 是 4294967296 实在没这个必要。

声音也有码率,码率的大小等于 采样率 x 采样大小 x 通道,通道就是单声道或双声道。

PCM

如何将声音模拟型号变为数字型号呢?这里就要用到 PCM 脉冲编码调制, 首先将声音定期采样,采样完成后就对信息量化,最后会用 PCM 定义的格式将每一组量化值表示为一组二进制,这样电脑就可以理解了。PCM 中的声音数据是没有被压缩的,所以 PCM 编码也可以称为无损编码。wav 格式实际上就是把 PCM 包装了一下。

wav 是微软公司推出的一种音频储存格式,主要用于保存 Windows 平台下的音频源,无损格式除了 wav 格式还有 ape 和 flac,它们本质是压缩了 wav,播放时再还原成 wav

有损编码

有损编码主要是去掉音频中那些对人类听觉不重要的部分。

MP3

MP3 (MPEG-1 或 MPEG-2 Audio Layer III) 编码,它是在1991年,由位于德国埃尔朗根的研究组织弗劳恩霍夫协会的一组工程师发明和标准化,的它的压缩比是 1:10或 1:12,它的兼容性很好,有非常多的软件支持,但是它太老了,如今被使用的并不多了。

AAC

AAC (Advanced Audio Coding) 编码,出现于1997年,为一种基于 MPEG-2 的有损数字音频压缩的专利音频编码标准。

AAC编码的主要扩展名有三种

  • .aac - 使用 MPEG-2 Audio Transport Stream 容器,区别于使用 MPEG-4容器的 MP4/M4A 格式,属于传统的 AAC编码。

  • .mp4 - 使用了 MPEG-4 Part 14 的简化版即 3GPP Media Release 6 Basic进行封装 的AAC 编码

  • .m4a - 为了区别纯音频 MP4 文件和包含视频的 MP4 文件而由苹果使用的扩展名,Apple iTunes 对纯音频 MP4文件采用了 .m4a命名。M4A 的本质和音频 MP4 相同,故音频 MP4 文件亦可直接更改扩展名为 M4A

AAC 现在很常用,兼容性也不错,一般和 h.264 一起使用。

Opus

Opus 编码,由 Xiph.Org基金会开发,之后由互联网工程任务组进行标准化,目标是希望用单一格式包含声音和语音,目标是用于低延迟的网络环境,它适用于视频会议,电话语音等领域。压缩比是 1:18 而且它在高码率下比 AAC 音质更好,一般和 vp9 一起用。

Vorbis

Vorbis b编码,由 Xiph.Org 基金会所领导并开放源代码的一个免费的开源软件项目,Vorbis 通常以 Ogg 作为容器格式,所以常合称为 Ogg Vorbis,一般与 VP8一起使用。当前 Xiph.Org 基金会建议使用延迟更低、音质更好的 Opus 编码来取代 Vorbis

总结

  • 视频一般由视频容器、编码过的视频和音频组成,一个视频文件中也可以包含字幕或多个音频。

  • 视频中常用的颜色编码是 yuv420,它更节约空间。

  • 视频最常使用的组合是 h.264 + aac编码。

  • 视频中 I 帧最重要,但占用空间更多,B 帧只有通过前后帧的运算才能知道,占用空间更小。

全文完


以下文章您可能也会感兴趣:

我们正在招聘 Java 工程师,欢迎有兴趣的同学投递简历到 rd-hr@xingren.com 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值