使用 ffmpeg 从一组 .png 图像制作无损视频

使用 ffmpeg 从一组 .png 图像制作无损视频

我有一组 .png 图像,我想使用 macOS 上的 ffmpeg 将它们制作成动画电影,但当我查看生成的视频时,质量总是被压缩,并且生成的视频有伪影,而原始图像没有。这是一个视频中的图片以及同一节的原始图像。我尝试使用 crf = 0 的 h.264 编解码器进行编码,但是运行 ffmpeg 时出现奇怪的错误:

为输出文件 #0 (test.mp4) 指定的编解码器 AVOption crf(选择恒定质量模式的质量)尚未用于任何流。最可能的原因是类型错误(例如没有视频流的视频选项)或它是某些编码器的私有选项,实际上并未用于任何流。

我使用以下 ffmpeg 命令来生成它:

ffmpeg -f image2 -r 10 -i image%05d.png -vcodec h264 -crf 0 -y test.mp4

一种可能性是它被禁用了(参见下面的完整控制台输出),但这对我来说没有意义,因为当我使用ffmpeg -codecsas列出 ffmpeg 编解码器时它确实会出现

DEV.LS h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (encoders: h264_videotoolbox )

以下是完整的控制台输入/输出:

ffmpeg -f image2 -r 10 -i image%05d.png -vcodec h264 -crf 0 -y test.mp4
ffmpeg version 4.0 Copyright (c) 2000-2018 the FFmpeg developers
  built with clang version 4.0.1 (tags/RELEASE_401/final)
  configuration: --prefix=/Users/user/anaconda3 --cc=x86_64-apple-darwin13.4.0-clang --disable-doc --enable-shared --enable-static --enable-zlib --enable-pic --enable-gpl --enable-version3 --disable-nonfree --enable-hardcoded-tables --enable-avresample --enable-libfreetype --disable-openssl --disable-gnutls --enable-libvpx --enable-pthreads --enable-libopus --enable-postproc --disable-libx264
  libavutil      56. 14.100 / 56. 14.100
  libavcodec     58. 18.100 / 58. 18.100
  libavformat    58. 12.100 / 58. 12.100
  libavdevice    58.  3.100 / 58.  3.100
  libavfilter     7. 16.100 /  7. 16.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  1.100 /  5.  1.100
  libswresample   3.  1.100 /  3.  1.100
  libpostproc    55.  1.100 / 55.  1.100
Input #0, image2, from 'image%05d.png':
  Duration: 00:00:25.00, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: png, rgba(pc), 1382x1036 [SAR 2834:2834 DAR 691:518], 10 fps, 10 tbr, 10 tbn, 10 tbc
Codec AVOption crf (Select the quality for constant quality mode) specified for output file #0 (test.mp4) has not been used for any stream. The most likely reason is either wrong type (e.g. a video option with no video streams) or that it is a private option of some encoder which was not actually used for any stream.
Stream mapping:
  Stream #0:0 -> #0:0 (png (native) -> h264 (h264_videotoolbox))
Press [q] to stop, [?] for help
GVA info: Successfully connected to the Intel plugin, offline Gen95 
[h264_videotoolbox @ 0x7fc150018600] Color range not set for yuv420p. Using MPEG range.
Output #0, mp4, to 'test.mp4':
  Metadata:
    encoder         : Lavf58.12.100
    Stream #0:0: Video: h264 (h264_videotoolbox) (avc1 / 0x31637661), yuv420p, 1382x1036 [SAR 1:1 DAR 691:518], q=2-31, 200 kb/s, 10 fps, 10240 tbn, 10 tbc
    Metadata:
      encoder         : Lavc58.18.100 h264_videotoolbox
frame=   82 fps=0.0 q=-0.0 size=       0kB time=00:00:07.70 bitrate=   0.0kbits/frame=  196 fps=195 q=-0.0 size=     256kB time=00:00:19.10 bitrate= 109.8kbits/frame=  250 fps=198 q=-0.0 Lsize=     616kB time=00:00:24.90 bitrate= 202.5kbits/s speed=19.7x    
video:614kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.305027%

解决方案: 显然,标签确实是--disable-libx264我的问题。显然,需要从 conda-forge 安装 ffmpeg,而不是从标准 anaconda 安装,才能对 x264 视频进行编码。

答案1

您正在使用通用值-vcodec,在您的情况下,该值会选择名为 h264_videotoolbox 的编码器。此编码器不使用-crf。相反,在选择编码器时要具体,并使用 libx264(或 libx265):

ffmpeg -framerate 10 -i image%05d.png -c:v libx264 -crf 0 output.mp4

如果您想避免 RGB 到 YUV 颜色空间的转换,请使用 libx264rgb:

ffmpeg -framerate 10 -i image%05d.png -c:v libx264rgb -crf 0 output.mp4

如果您只想制作无损 PNG 视频,您可以保留图像原样:

ffmpeg -framerate 10 -i image%05d.png -c:v copy output.mkv

相关内容