我经常通过准备 .png 格式的所有帧(最小压缩)来创建数字动画,我需要将其转换为视频格式以上传到 reddit、instagram、gfycat 等网站。
我对所有不同的压缩标准知之甚少,这些网站也不太清楚它们接受什么格式,但我找到了一个通常对我有用的方法,它创建的文件可以被这些网站接受:
# step 1
mencoder mf://frame*.png -mf w=$WIDTH:h=$HEIGHT:fps=$FPS:type=png \
-ovc lavc -lavcopts vcodec=msmpeg4v2:vbitrate=16000:keyint=15:mbd=2:trell \
-oac copy -o step1.avi
# step 2
mencoder step1.avi -o step2.mp4 -of lavf -lavfopts format=mp4 -ovc x264 -sws 9 \
-x264encopts nocabac:level_idc=30:bframes=0:bitrate=2048:threads=auto:turbo=1:global_header:threads=auto:subq=5:frameref=6:partitions=all:trellis=1:chroma_me:me=umh
但是我不完全确定它的作用*,因此我无法:
使其成为一条指令
调整压缩率。
事实上,我通常更喜欢压缩较少的结果。
从 PNG 帧到网络友好的视频文件(我认为是H.264/MPEG-4 MP4),我可以遵循什么路线,让我能够调整压缩?
* 例如:这是一个示例框架
(注意:老实说,在我看来,在 VLC 中观看它比通过 VLC 工具拍摄快照时看起来更糟——这使得问题难以理解并且结果可比较)
即使在第 1 步中我已经指定$WIDTH
并$HEIGHT
匹配原始图像的那些,它显然已经改变了两者,并且没有保留纵横比。最终图像也有更多模糊,这可能只是这种调整大小的效果。
编辑:查看下面 mplayer 窗口的实际系统截图(与 VLC 相同)。与 PNG 源和 VLC“内部”屏幕截图功能相比,瓷砖灌浆非常模糊
细节:
ffmpeg
正如评论中所指出的,
ffmpeg
提供了一个简单的“质量”参数的良好一步解决方案:crf
或“恒定速率因子”(阅读这篇解释 crf 的帖子)。有关使用 ffmpeg 从 PNG 转换到 H.264 的简单说明,请参阅这篇文章。
简而言之:
$CRF
默认为 23;小于 23 的值会提供更好的质量和更大的文件,大于 23 的值会增加压缩率。