PNG 帧的 H.264/MPEG-4:如何以及如何调整压缩

PNG 帧的 H.264/MPEG-4:如何以及如何调整压缩

我经常通过准备 .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 的值可提高压缩率。

相关内容