我经常通过准备 .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“内部”屏幕截图功能相比,瓷砖灌浆非常模糊
细节:
答案1
ffmpeg
正如评论中指出的,ffmpeg
提供了一个良好的一步解决方案,具有简单的“质量”参数:crf
或“恒定速率因子”(阅读这个帖子解释crf)。
看这个帖子有关使用 ffmpeg 从 PNG 转换为 H.264 的简单说明。
简而言之:
# Assuming the frames are called frame0000.png, frame0001.png ...
#
# set $FPS, $WIDTH, $HEIGHT, $FIRSTFRAME,
# $CRF (see above) to the desired value, then run:
ffmpeg -r $FPS -f image2 -s ${WIDTH}x$HEIGHT -start_number $FIRSTFRAME \
-i frame%04d.png -vcodec libx264 -crf $CRF -pix_fmt yuv420p output.mp4
$CRF
默认为 23;小于 23 的值可提供更好的质量和更大的文件,大于 23 的值可提高压缩率。