【每天学点‘音视频’】面试官:什么是音视频及实时音视频

我最近突然一直在想这个问题,如果别人问我,我该如何作答,所以今天把这块梳理下,如果有不足,还望指正。
音视频
音视频是音频和视频技术的结合,涵盖从采集、编码、传输、解码到渲染的全过程。音频处理声音信号,视频处理动态图像。比如我们常见的直播、视频会议、视频通话等都是音视频场景。
音视频总流程可以概括为四点:
采集:就是通过麦克风、摄像头将物理信号转换为数字信号
编码:使用压缩算法(H264/AAC)分别将视频和音频数据进行压缩,主要为了减少数据体积,便于存储和传输(编码的本质是压缩)
传输:通过协议(如 RTMP、WebRTC)实现实时或分发包传输。在传输过程中可能会涉及一些抗丢包的优化算法
渲染:就是观众可观听到视频和音频画面
实时音视频
是指能够在极低延迟(毫秒级到几百毫秒)下完成音频和视频数据的采集、编码、传输、播放,实现双方或多方几乎“同步”的交互体验。常见的实时音视频就是实时通信、互动直播(直播赛事、在线教育)等。
特点
低延迟
普通视频延迟可能几秒;而实时音视频要求端到端延迟控制在毫秒级别,例如七牛视频通话通常< 200ms。
高实时性
要求数据快速处理,避免卡顿确保交互流畅。
强抗弱网性
需要自适应网络丢包、抖动;涉及到的大概是通过 FEC、重传、码率自适应等技术保障流畅性。
所涉及到的关键技术和音视频类似
采集
音频:麦克风降噪( AI 降噪)、回声消除( AEC )
摄像头预览、美颜、滤镜、分辨率、帧率适配
编码与压缩
音频:Opus(低延迟音频编码)、AAC
视频:H264、H265、VP8、VP9
传输协议
基于 UDP 的协议减少 TCP 重传延迟
抗丢包技术:NACK(丢包重传)、FEC 等
渲染与播放
在音视频中其核心技术主要是编码,这也是音视频的重点和难点,编码格式包括 H264、H265,当然还有 VP8、VP9 等。通常被问的就是 H264 视频编码流程或者 H264 编码原理以及 H264 与 H265 的区别,
H264 视频编码流程
如何一句话概括 H264 视频编码流程?
H264 通过预测(空间(帧内预测)和时间(帧间预测)冗余)、变换量化(丢弃人眼不敏感的细节)和熵编码(高效压缩数据),用最小的数据量保留最关键的视觉信息。
H264 也称为 AVC(Advanced Video Coding)是一种广泛使用的视频压缩标准,视频编码的意义是视频压缩,如何将视频压缩?分为以下几个步骤
分块处理
视频中有很多帧就像拼图一样,把每一帧画面切成 4x4 或者 16x16 的小方块,这个小方块叫做“宏块”
帧内/帧间预测
其核心思想就是利用视频的冗余(前后帧相似、相邻区域相似)来减少数据量。
分为两种预测方式:
帧内预测
例子: 比如画面有一面纯色墙,某个块的像素值和左边块几乎一样,就直接记录“这个块和左边块相同”,而不是记录所有像素值。
方法: 用周围已编码的块预测当前块(方向预测、均值预测等)。
帧间预测(参考前后帧猜)
例子: 视频中一个人在走路,前后帧只有手臂位置变化,背景没变。只需记录“手臂移动了多少”,而不是重新存整个画面。
方法: 通过运动估计(Motion Estimation)找到前一帧/后一帧中最相似的块,并计算运动向量(Movement Vector)。
变换与量化(细节取舍)
DCT 变换(离散余弦变换)
作用: 将块内的像素值转换成“频率分量”(类似把声音分解成高音、低音)。
通俗理解: 像把一幅画分解成“大体轮廓”+“细节纹理”,人眼对轮廓更敏感,细节可以适当丢弃。
量化(有损压缩的关键)
作用: 减少高频细节的精度(类似照片磨皮,去掉细小噪点)。
控制参数: 量化步长(QP 值),步长越大,压缩率越高,画质损失越大。
4. 熵编码(终极压缩)
目的: 用更短的二进制码表示高频出现的符号。
方法:
CAVLC(上下文自适应变长编码):对常见符号用短码,罕见符号用长码(像摩斯密码,高频字母“E”用“·”表示)。
CABAC(上下文自适应二进制算术编码):更高级,进一步压缩 5~15%的体积。
提到了帧,不得不说三种视频帧,分别是 I 帧、P 帧、B 帧
I 帧(Intra Frame):关键帧,独立编码,不依赖其他帧(类似 JPEG 压缩)。视频第一帧从 I 帧开始,(就像写日记,记录全天事件)
P 帧(Predicted Frame):参考前一帧(I 或 P 帧)进行运动补偿预测。(就像写日记,只写“和昨天一样,除了下午去超市”)
B 帧(Bi-directional Frame):参考前后帧,压缩率最高,但延迟高(实时通信通常禁用)(就像写日记,写“和第一天一样,但晚上看了电影”)
如果实时通信中出现 B 帧会出现卡顿问题,另外在工作中经常使用的就是如何查看视频中是否存在 B 帧,可以使用命令
ffprobe -show_frames 视频 | grep "pict_type=B"
今天了解的内容消化下,下个章节再说。
版权声明: 本文为 InfoQ 作者【小曾同学.com】的原创文章。
原文链接:【http://xie.infoq.cn/article/57f96e91d62f92f1b947b3681】。文章转载请联系作者。
评论