《深入理解FFmpeg》
- 官方库及发展
Codec、Format和Protocol、Filter
无论是在播放端、服务器端、制作端还是推流端,几乎所有需求都可以通过FFmpeg实现
- 框架及内容
FFmpeg的架构经过了跳跃式调整,加入了大量的音视频处理滤镜,并集成了神经网络框架,原有的Format如今也被拆分成了Muxer和Demuxer两个大的模块,编解码接口从原有的单一操作接口变成了模块定制者高可选性接口。
音视频算法再也不是抽象枯燥的公式和标准,而是在鲜活的应用场景中解决实际问题的利器。一步步向搭建互联网服务器、深入调优、进行内核开发、构建大型系统演进,这是一个逐渐深入的过程
FFmpeg的分层模块化架构思想与Linux内核类似,十分简洁优美,其中还包含丰富的图像与视频基础库和网络协议实现、底层汇编优化等。
- 技术点
编解码技术持续演进,流媒体传输协议也开始面向特定场景演化,派生出点播、超低延时直播、互动直播、短视频、在线会议、在线视频编辑、VR/AR/MR等不同形态。整个音视频领域正朝着超高清、低延时、强互动等方向演进。
对FFmpeg的使用各有不同,主要分为两类:基于命令行和使用其API
雷霄骅博士的博客内容已经可以覆盖FFmpeg的大部分使用场景,FFmpeg官方代码用例目录也涉及大量场景
和使用案例。近几年低延迟直播、超低延迟直播、视频会议及实时互动也有了迅猛的发展和实质的进步,FFmpeg也应用于很多RTC(RealTime Communication,实时通信)场景。
- 关注
音视频基础;硬编解码、更多容器封装细节(FLV、MP4、MPEG-TS等);API使用说明及实例;自定义FFmpeg模块的开发者;云剪辑中的音视频处理技术;RTC场景中FFmpeg使用。
- 实例
https://ffmpeg.org/doxygen/trunk/examples.html
FFmpeg官方文档:http://ffmpeg.org/documentation.html
FFmpeg官方wiki:https://trac.ffmpeg.org
雷霄骅博士总结的资料:http://blog.csdn.net/leixiaohua1020
ChinaFFmpeg:http://bbs.chinaffmpeg.com
基础
视频
在不同体系结构的计算机中存储的图像需要互通,因此就出现了很多不同的存储方式,如RGBA、ABGR、BGRA、ARGB等
p指逐行扫描,如果是1080i,则指隔行扫描,完整扫完1帧(一场)图像,主要是由图像的高度(行数)决定的,这也是为什么我们常说1080p,而不说1920p
一块屏的分辨率达到300ppi以上,我们就叫它视网膜屏
只有当图像与显示器的分辨率匹配时,才能达到最好的显示效果
1帧1080p的图像有2073600像素,按8位色深的RGB格式存储,需要约6MB的存储空间。
常用的视频压缩技术的原理是运动估计和运动补偿
有些颜色眼睛不敏感,有损压缩JPEG
两帧图像差异不大,只存储或传输图像间的差异信息,而不是整帧图像。H264(AVC)、H265(HEVC)、VP8、AV1等。
常见的1080p@25fps视频,只需要2Mbit/s~4Mbit/s的传输带宽,实际占用的带宽与视频的复杂度(画面细节、运动快慢程度等)和帧率、分辨率都是正相关的。
需要编解码的视频图像一般不使用RGB色彩空间,而是使用一种称为YUV的色彩空间,两者之间有直接的对应关系,但由于转换过程涉及浮点运算,转换是有损的,但对人眼来说几乎无法分辨。“Y”表示明亮度,“U”和“V”则分别表示色度和浓度。
Key Frame,在H.264中一般为IDR(Instantaneous Decoding Refresh)帧,IDR帧又称为立即刷新图像,还有普通的I帧(Intra-coded picture)。所有IDR帧都是I帧,但不是所有I帧都是IDR帧。
每个GoP里的第1个I帧是IDR帧,后续的I帧虽然能独立解码,但它前/后面的P帧(或B帧)可能会参考I帧后/前面的帧,但GoP内的帧参考不会跨越IDR帧。当然,在H.265或其他编解码中,对IDR帧和I帧的定义还是有更细微区别的,但总的来说关键帧就是为了刷新图像的。在此为简洁起见,并未特别区分I帧和IDR帧
在实际的编码器上,一般会对图像分组,分组后的图像称为GoP(Group of Pictures)。
GoP可以是固定的,也可以是按需的(比如没有数据丢失就不用生成关键帧,或者丢失比较严重时就多生成几个关键帧)。有些编码器有场景检测功能,即在场景切换时,两帧间差异太大,以至于共同信息较少或者根本没有共同的信息,这时候就直接生成一个关键帧。
收到B帧后不能立即解码,在实时音视频应用中会带来延迟,因而在实时通信中一般不使用B帧。
音频
在广播电视领域一般使用TS(Transport Stream,传输流或者MPEG-TS)封装和传输,音频和视频也是交错发送的,主要是为了保证实时性。RTMP流一般用于CDN推拉流,也是音频和视频交错发送。SIP及WebRTC通信的实时性更好一些,使用RTP流传输,音频和视频使用不同的流(不同的端口号)发送,有时为了节省端口号也会合并到一个流上发送。
AR(增强现实)、VR(虚拟现实)及元宇宙的概念非常火。3D音视频等都需要更多的声道和全景360°的图像及视频支持。音视频到了3D以后,不仅需要更多的存储空间(如3D全息图像的点云存储需要海量的存储空
间)来描述各声道、图像视角之间的关系,还要支持头部及肢体转动时的实时反馈,以便通过耳机、头显、传感器等设备还原出一个真实世界。