音视频技术一句话简单来说就是通过网络将图像和声音从生产端分发给消费端的技术。可以是以点播的方式,也可以是直播的方式,也可以是像视频会议一样互动的方式。现在的网络流量一多半都是在传输音视频的数据,音视频相关的app几乎每个人都在使用,占据了大众娱乐的半壁江山。
音视频学习路线
视音频基础知识——视音频解码——视音频编码——视音频转码——视音频播放——具体应用——其他高阶内容
其实就对应于你在通信原理里学过的基本通信模型,下面以流媒体传输系统为例画个对应项示意图,基本上除了中间信道的部分,都是编解码生涯中要研究的东西。
下面我针对学习路线中的各部分单独做一下介绍
标题【戳我领取】《全套音视频入门到精通手册》
视音频知识:
1、视频、图像、音频的格式。这里的“格式”是一个广义的概念,既包括MP4,FLV这样的封装格式,也包括H264,MPEG2这样的编码格式,还包括420 422 444这样的取样格式,甚至RGB,HSV,YUV这样的彩色空间也可以算作一种格式,将来在应用时还可能会遇到RTMP,HLS这样的流媒体传输协议或者其他的协议,都可以算作格式。
2、信息论以及压缩编码入门。在你学习前面的各种格式时不可避免地会涉及到一些压缩编码的知识,随便拿一本讲视频编码的书,前面的绪论也都会简单讲讲信息论知识。简单来说,你需要知道视音频为什么要压缩编码,为什么可以实现压缩编码,怎样评价压缩编码的质量,以及具体编码过程中的一些概念,比如型(profile)和级(level),GOP,IPB帧,NAL单元,宏块,运动矢量、量化参数,帧内编码(当然你首先要知道帧率、场频这类的概念),帧间预测,这一大堆的概念,在不同的编码标准中还会有各种专属的概念。
音视频的采集
音视频的采集包括摄像头的采集,麦克风,扬声器,本地视频,游戏图像,显示器桌面的采集等等。
不同平台有对应的编程框架,比如 windows 下的 DirectShow 框架可以采集摄像头的图像数据,macOS Android Linux都有相应的框架采集音视频的数据, obs stuido 这个开源项目可以作为学习各平台音视频的采集的入口。
预处理
视频数据的预处理一般包括视频图像的滤镜处理、美颜处理、加字幕,绿幕抠图。
音频的预处理一般包括声音的3A算法和变速变调处理,这个在 WebRTC里面有详细的介绍和实现。
- AGC:自动增益补偿功能(Automatic Gain Control)
- ANS:背景噪音抑制功能(Automatic Noise Suppression)
- AEC:回声消除器(Acoustic Echo Canceller)
编码
视频的编码标准:
- H264
- H265
- VP8
- VP9
- AV1
音频的编码标准:
- AAC
- Opus
- mp3
以我目前的工作经验最常用的视频编码是 h264 音频编码是 AAC 编码。
封装
音视频编码后需要将音视频包以某种容器封装起来,这个步骤成为音视频的封装。常见的封装格式
flv
mp4
ts
rtp
ffmepg 支持非常丰富的媒体封装格式。查看 ffmepg 支持的封装格式命令如下
ffmpeg -muxers
传输
常见的音视频的网络传输协议有 rtmp http-flv rtsp srt hls rtc udp ,各有优劣,这里不做详细对比。
解封装
解封装是上面介绍的封装的逆操作,从音视频的容器中将音频包、视频包分离出来放到各自的队列,等待各自的解码线程去解码渲染视频,播放音频。
解码
编码的逆操作,将视频包解码成原始的视频帧,将音频包解码成原始的pcm音频数据。
渲染
视频的渲染 windows 平台下可以使用 Direct3D 技术渲染视频,macOS,Android 和 Linux 可以使用 OpenGL 、OpenGLES 技术渲染视频。
3、在你学过前面的基础知识后,是时候上手实践了。编解转码方面有很多开源工程在业内外都得到了广泛的应用,最著名的是ffmpeg。你的编解码生涯有一半可能都要耗在ffmpeg身上了,这个项目是如此庞大,如此牛逼,我都不知道该怎么介绍了,而且你在学习这个项目的过程中也可以接触到包括x264在内的一大票其他开源项目。
音视频的学习知识面很深,也很广。所以学习需要积累。
音视频行业已经发展很多年了,随着近几年移动端越来越多的音视频APP的出现,将音视频推向一个高潮,但是由于音视频的学习成本很高,很多开发者望而却步,为了跟紧时代的步伐 ;
根据上面路线学习,我整理出这套音视频学习资料。还有相对应的视频配合学习。学习起来可以事半功倍。
【戳我领取】《全套音视频入门到精通手册》