今天在摸鱼时对于视频文件的大小和清晰度产生了疑惑。有三个视频文件:
test2.mov,使用 mac 自带录屏产生的文件。637MB 。
test2.mp4,使用 ffmpeg 转换后的文件。ffmpeg -i test2.mov -vcodec h264 -acodec aac test2.mp4 。84MB 。
test2-2.mp4,使用 obs 的录像转封装功能对 test2.mov 进行操作后得到的文件。637MB 。
test2.mov 和 test2-2.mp4 都是 35fps 的,test2.mp4 还是 55fps 的。三者的清晰度似乎差不多。
为啥 test2.mp4 能够有相同的清晰度更高的帧率反而更小的体积呢?
同时想到了我的垃圾手机拍出来的视频清晰度贼垃圾,反而空间非常大,气死我了。。
视频的清晰度与大小是否有直接关系呢?视频的大小是由哪些因素决定的呢?
1
hguandl 2022-03-26 13:28:00 +08:00 1
MP4 是封装格式,内容主要取决于里面的视频流。QuickTime 自带录屏要保证实时性,编码速度不能慢,所以就没时间做很多压缩优化,码率就会高。所谓 FFmpeg 的转换格式,其实是给视频流重编码了,这时候重视的是质量和体积,所以可以用较长的时间来进行编码,而且 CPU 占用会非常高。
FFmpeg 可以也支持录像转封装和硬件加速编码,OP 可以试试别的参数,理解一下不同用法 |
2
zcf0508 2022-03-26 13:29:53 +08:00 via Android 1
[高画质的背后——视频的封装与编码-哔哩哔哩] https://b23.tv/YofmWKR
|
3
coderluan 2022-03-26 13:48:22 +08:00
视频压缩和封装是两个过程,前者是 h264 这些,会很大影响体积,后者只是把视频声音图片打个包,mp4 ,mov 这些。test2-2.mp4 只是换了个打包方式,没压缩,体积自然没啥变化。
另外帧率只影响视频流畅度,影响视频清晰度的是码率,也就是一帧多大空间,而帧率是动态生成的,视频简单的话,是可以做到低帧率的时候清晰度差不多的,录屏的话,屏幕大部分画面是不动的(专业说法叫视频时间冗余多),这些都能很好的进行压缩,所以 test2.mp4 体积会小很多。 |
4
xmumiffy 2022-03-26 14:00:35 +08:00 via Android
决定视频文件大小的只有两个参数 时长和码率
|
5
GeruzoniAnsasu 2022-03-26 14:01:32 +08:00 1
1. 视频文件有封装格式和视频流编码格式两个概念(其实「格式」不准确,但正因为这两个概念容易混淆所以我用相似的词提醒)
2. 封装是指 mp4/avi/mkv 这样的容器格式,除了视频流外还可以封装音频流、字幕、音画同步信息等额外的东西。你的 test2.mov 和 test2-2.mp4 由于没有经过重编码所以它们的主要内容,即原来那个视频流,是完全一样的,只是采用了不同封装而已,类似一个 gz 压缩一个 zip 压缩 3. 视频流的编码指的是 mpeg1/h.264/AV1/hevc 之类的算法,更先进的算法可以实现更高的清晰度、分辨率的同时降低所需的空间大小。以前 av 画质时一个视频几百 m ,现在 1080p 一个视频还是几百 m ,这是编码方式在影响 4. 在采用同样编码方式的前提下(比如你展示的 3 个文件视频都是 x264 编码的,它们都是 h.264 视频流),能控制的参数也还有非常多。不同的采集设备和播放设备能支持的参数不同,所以有非常多级的标准来限制编码器的数十上百个参数变量。比如老旧便携播放器解码能力很弱,甚至没有并行指令集( SIMD 之类的指令集),那视频就不能编码得太复杂,跟手游不用高精 3D 模型一个道理。 5. 那么具体到算法上是些什么差异呢: 前后帧变化估计的精确性、变化位置的搜索方式、搜索范围、压缩时寻找最佳字典的复杂度、区域片段「重要性」占整体的权重…… 打个粗浅的比方,完美的编码: 「 这一帧的像素由前 20 帧的 x 到 y 位置卷积后与 10 帧后的 z 位置相乘得到,下一帧的图像人肉眼不可能看清,所以直接使用本帧 1/4 分辨率数据。」 辣鸡编码: 「这一帧有 1920*1080 个像素,但我只记了一万个位置的值,分区平摊吧,依次是 1.1,0.9,0.132,0.15768……」 显然完美编码体积就能很小同时也很精确。辣鸡编码就又占地又粗糙。但前者要得到这么准确的前后参考数据是要经过大量反复多次的搜索和迭代的,这也是编码器编码要花大量时间的原因。实际应用时,往往会在编码耗时和成品质量 /大小之间取舍一个合适的平衡 |
8
A01514035 OP @GeruzoniAnsasu #5 非常专业,感谢解答!
|
9
A01514035 OP @hguandl #1 我还纳闷为啥这条 ffmpeg 执行了很长时间,但是 obs 的转封装立马就好。原来是 ffmpeg 进行了重编码。以后要学会使用 ffmpeg !
|
10
msg7086 2022-03-26 15:43:06 +08:00 via Android
录屏一般用更快但是编码效率更低的参数。录完以后再次压制的时候可以把参数拉高提升编码效率。
做视频编辑的时候也是这样,中途剪辑的时候用 prores 或者 lagarith 来保存,最后输出成品的时候再用 x264 或者 x265 。 |
11
MonoLogueChi 2022-03-26 17:48:55 +08:00 via Android
视频清晰度和码率,主要是看编码器和编码参数。中间的关系很复杂,大致有下面这样的一个关系(不是线性关系)。
同样的硬件环境和编码器(cpu 或显卡满载情况下,即硬件占用也相同),调整编码参数。在视频质量相同的时间下,码率越低,编码用时越长。在相同的码率下,质量越高,编码用时越长。相同的编码用时下,质量越高,码率越高。 同样的编码器和编码用时下(即直播或实时录像对应的场景),调整编码参数。在视频质量相同的情况下,码率越低,对硬件需求越高。在对硬件需求相同的情况下,视频质量越高,码率越高。码率相同的情况下,视频质量越高,对硬件的需求也就越高。 |
12
MonoLogueChi 2022-03-26 17:53:01 +08:00 via Android
总结一下就是,拿时间换空间,拿金钱换时间
拿编码时长换取更低的码率,拿更好的硬件和更高效的编码器换取更短的编码用时 |
13
ouqihang 2022-03-26 18:04:09 +08:00 via Android
手机拍的转一下格式,体积大幅缩小。
|
14
A01514035 OP ffmpeg -hwaccel_output_format cuda -c:v h264_cuvid -i o.mkv -acodec aac -c:v h264_nvenc -y huoshan.mp4
o.mkv 是 obs 录制的视频,转换后又从 1.7G 到 3.0G ,这次反而是体积增加了。 |