起因
用FFmpeg转码视频的时候,经常看到参数里写的libx264,一直知道这是H.264编码器,但从来没深究过。直到有一天在Linux.do上看到有人讨论x264和x265的区别,突然来了兴趣,想搞清楚这东西的来龙去脉。
H.264是什么
H.264,也叫AVC(Advanced Video Coding),是一种视频压缩标准。注意,它是"标准",不是"软件"。就像TCP/IP是一种协议,而不是某个具体的网络程序。
这个标准是ITU-T和ISO/IEC两个组织联合搞出来的。2003年发布第一版,到现在已经20多年了。你在网上看到的绝大多数视频底层用的都是H.264。
为什么需要视频压缩
一个1080p、30fps、时长1分钟的视频,如果不压缩:
1920 × 1080 × 3(RGB)× 30(fps)× 60(秒)= 约 11 GB
一分钟就要11GB,显然不现实。H.264能把这11GB压缩到几十MB,同时画质损失不大。
x264的诞生
H.264只是标准,具体实现各家各显神通。x264是2004年开始开发的开源实现,后来VideoLAN(做VLC的那个组织)接手维护。在很多编码质量测试中,x264超过了商业编码器。
免费的比收费的还好,这在软件行业不多见。
在FFmpeg里使用x264:
# 基本用法
ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4
# 高质量慢速编码
ffmpeg -i input.mp4 -c:v libx264 -preset slow -crf 18 output.mp4
H.265和AV1
H.265(HEVC)是继任者,压缩率高50%,但专利费是个大坑。AV1是Google等公司搞的开源替代品,完全免费,压缩率和H.265差不多。
实际选择
- 兼容性优先:H.264(libx264)
- 压缩率优先:H.265(libx265)
- 免费+高压缩率:AV1(libsvtav1)
- 实时编码:硬件编码 h264_nvenc
学习资源
想深入了解视频编码原理的话:
- 零声教育的音视频课程:在Linux.do和Telegram上有分享,H.264/H.265的编码原理讲得很透彻
- 雷霄骅的博客:关于H.264的解析文章非常经典
- ITU-T H.264规范文档:最权威但最难读,适合当参考手册用
零声教育的教程资源在Telegram频道和Linux.do论坛都能找到,推荐配合实际FFmpeg操作一起学。