视频基础概念:容器格式、编码格式、码率、帧率、分辨率、关键帧与GOP
说实话,我见过不少刚入行的朋友,一上来就急着敲FFmpeg命令。结果呢?参数填错了,出来的视频要么打不开,要么画质惨不忍睹。我个人习惯是,先花点时间把视频的“骨架”搞清楚。这章咱们就把这些基础概念掰开揉碎,讲明白。
你想想看,一个视频文件,它其实是个“套娃”。最外层是容器,里面装着视频流、音频流,可能还有字幕流。每个流又用了不同的编码方式。搞懂这些,你才能精准地控制FFmpeg。
核心一句话:容器是包装盒,编码是压缩算法。FFmpeg的工作,就是拆盒、换算法、再打包。
2.1 容器格式(Container Format)
容器格式,说白了就是视频文件的“外壳”。它决定了文件的后缀名,比如.mp4、.mkv、.avi。容器本身不压缩视频,它只负责把视频流、音频流、字幕、元数据(比如封面、章节信息)打包在一起。
我在项目中遇到过最头疼的事,就是客户给了一个.mkv文件,但播放器只认.mp4。这时候,FFmpeg的“换壳”功能就派上用场了。
| 容器格式 | 常见后缀 | 特点 | 我常用的场景 |
|---|---|---|---|
| MP4 | .mp4 | 兼容性最好,几乎所有设备和平台都支持 | 最终交付、上传网站 |
| MKV | .mkv | 开源、功能强大,支持多音轨、多字幕、章节 | 收藏原盘、封装多语言 |
| AVI | .avi | 老古董,体积大,不支持现代编码(如H.265) | 几乎不用,除非处理老旧素材 |
| MOV | .mov | 苹果生态常用,质量高,但文件大 | 从Final Cut Pro导出素材 |
| FLV | .flv | 流媒体时代的老将,现在逐渐被MP4取代 | 直播录制、老旧Flash项目 |
我的小技巧:如果你不确定用什么容器,选MP4准没错。它就像视频界的“普通话”,走到哪都能用。
2.2 编码格式(Codec)
编码格式才是视频压缩的核心。它决定了视频文件的大小和画质。常见的视频编码有H.264、H.265(HEVC)、VP9、AV1。音频编码有AAC、MP3、AC-3。
嗯,这里要注意:容器和编码不是绑定的。一个MP4容器里,可以装H.264编码的视频,也可以装H.265编码的视频。FFmpeg的强大之处,就在于它可以自由组合。
我曾经帮一个朋友转码,他原始素材是H.264编码的MP4,但平台要求必须是H.265编码。我直接用FFmpeg重新编码,文件体积直接缩小了40%,画质几乎没变。
| 编码格式 | 压缩率 | 画质 | 兼容性 | 我的评价 |
|---|---|---|---|---|
| H.264 | 中等 | 优秀 | 极好 | 老黄牛,稳定可靠 |
| H.265 (HEVC) | 高 | 优秀 | 较好 | 省空间利器,但编码慢 |
| VP9 | 高 | 优秀 | 一般(浏览器支持好) | YouTube的宠儿 |
| AV1 | 极高 | 极好 | 较差(编码极慢) | 未来之星,现在太慢 |
2.3 码率(Bitrate)
码率,就是视频每秒钟的数据量。单位是kbps(千比特每秒)或Mbps(兆比特每秒)。码率越高,画质越好,文件也越大。
码率分为两种:固定码率(CBR)和可变码率(VBR)。
- CBR(固定码率):全程保持一个码率。优点是文件大小可控,缺点是浪费带宽(简单画面也用高码率)。
- VBR(可变码率):根据画面复杂程度动态调整码率。复杂画面用高码率,简单画面用低码率。优点是画质更均衡,文件更小。
我个人习惯,99%的情况都用VBR。CBR我只在直播推流时用,因为需要稳定的数据流。
避坑指南:我曾经为了省空间,把码率压得太低。结果视频里全是马赛克,尤其是运动画面,根本没法看。记住:码率不是越低越好,要找到一个平衡点。
2.4 帧率(Frame Rate)
帧率,就是视频每秒包含多少张图片(帧)。单位是fps(帧每秒)。常见的帧率有24fps(电影)、25fps(PAL制式)、30fps(NTSC制式)、60fps(高帧率)。
帧率越高,画面越流畅,但数据量也越大。你想想看,60fps的视频,每秒要处理60张图片,对性能要求自然更高。
我做游戏录屏时,习惯用60fps,因为游戏画面变化快,低帧率会感觉卡顿。但做电影解说时,我会用24fps,保留电影的“胶片感”。
2.5 分辨率(Resolution)
分辨率,就是视频的宽高像素数。比如1920x1080,就是宽1920像素,高1080像素。分辨率越高,画面越清晰。
常见的分辨率有:
- 480p (640x480): 标清,老DVD画质。
- 720p (1280x720): 高清,入门级。
- 1080p (1920x1080): 全高清,目前最主流。
- 4K (3840x2160): 超高清,细节丰富。
- 8K (7680x4320): 超超高清,目前还比较小众。
分辨率、码率、帧率三者是相互影响的。分辨率越高,需要的码率也越高,才能保证画质。如果分辨率高但码率低,画面就会模糊。
2.6 关键帧与GOP
这是很多新手容易忽略的概念,但非常重要。关键帧(I帧)是一个完整的画面,它不依赖其他帧。而P帧(预测帧)和B帧(双向预测帧)只记录与前后帧的差异。
GOP(Group of Pictures,画面组),就是两个关键帧之间的帧序列。GOP越长,压缩率越高,但随机访问(比如快进、跳转)就越慢。
为什么会这样?因为解码器要播放某个画面,必须先找到最近的关键帧,然后一步步解码到目标帧。GOP越长,这个过程就越慢。
我曾经在做一个视频剪辑软件时,发现用户拖动进度条总是卡顿。后来一查,是编码器把GOP设得太长了。我调整了GOP大小,问题就解决了。
关键帧的作用:
- 支持随机访问(快进、快退、跳转)
- 错误恢复(如果某帧损坏,可以从下一个关键帧重新开始)
- 视频剪辑的“入点”和“出点”
在FFmpeg中,你可以通过 -g 参数控制GOP大小。比如 -g 250 表示每250帧一个关键帧(假设帧率是25fps,就是每10秒一个关键帧)。
# 设置GOP大小为250帧
ffmpeg -i input.mp4 -c:v libx264 -g 250 output.mp4
我的建议:对于普通视频,GOP设置在250-300帧比较合适。对于需要频繁剪辑或快进的视频,可以缩短到100-150帧。
这张图把本章的核心概念串起来了。你看,视频文件在最上面,下面是容器、编码和流。编码又衍生出码率、帧率、分辨率和关键帧。这些参数不是孤立的,它们互相影响。
搞懂这些,你再看FFmpeg的命令行,就不会觉得参数是乱写的了。每个参数,都对应着这里的一个概念。