避免 ffmpeg 中的重复帧

避免 ffmpeg 中的重复帧

我有一个 video.mp4,需要将其无损转换为一系列图像。我用过 ffmpeg -i input.mp4 $filename%05d.tiff ,但得到了很多(数千)个重复的帧。它们是什么?是否可以避免 ffmpeg 导出它们?我不得不停止操作,因为它花了很长时间。


视频文件::
codecH265 – MPEG-4 AVC(第 10 部分)(avc1)
Encoder:Lavf58.29.100
FPS:70.476432
resolution:1824 x 1216
Duration:0m31s


ffmpeg 的完整输出(我使用 Linux):

$ ffmpeg -i input.mp4 $filename%05d.tiff

ffmpeg version 4.4.2-0ubuntu0.22.04.1 Copyright (c) 2000-2021 the FFmpeg developers
  built with gcc 11 (Ubuntu 11.2.0-19ubuntu1)

  configuration: --prefix=/usr --extra-version=0ubuntu0.22.04.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-pocketsphinx --enable-librsvg --enable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared

  libavutil      56. 70.100 / 56. 70.100
  libavcodec     58.134.100 / 58.134.100
  libavformat    58. 76.100 / 58. 76.100
  libavdevice    58. 13.100 / 58. 13.100
  libavfilter     7.110.100 /  7.110.100
  libswscale      5.  9.100 /  5.  9.100
  libswresample   3.  9.100 /  3.  9.100
  libpostproc    55.  9.100 / 55.  9.100

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.29.100
  Duration: 00:00:31.88, start: 0.000000, bitrate: 746 kb/s
  Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 1824x1216, 741 kb/s, 70.48 fps, 1k tbr, 90k tbn, 2k tbc (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> tiff (native))
Press [q] to stop, [?] for help
Output #0, image2, to '%05d.tiff':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.76.100
  Stream #0:0(und): Video: tiff, yuv420p(progressive), 1824x1216, q=2-31, 200 kb/s, 1k fps, 1k tbn (default)
    Metadata:                                                                                                                                                                                
      handler_name    : VideoHandler                                                                                                                                                         
      vendor_id       : [0][0][0][0]                                                                                                                                                         
      encoder         : Lavc58.134.100 tiff                                                                                                                                                  
More than 1000 frames duplicatedN/A time=00:00:01.04 bitrate=N/A dup=976 drop=0 speed=0.0308x                                                                                                
More than 10000 frames duplicated/A time=00:00:10.74 bitrate=N/A dup=9989 drop=0 speed=0.0265x                                                                                               
frame=17673 fps= 26 q=-0.0 Lsize=N/A time=00:00:17.67 bitrate=N/A dup=16428 drop=0 speed=0.0262x                       

尝试了不同的选项后,我发现了 3 种可以实现相同结果的替代方案。下面我将详细说明。

选项1来源
评论:它使用可变帧率模式。
命令ffmpeg -i input.mp4 -vf mpdecimate -vsync vfr $filename%05d.tiff
结果:成功了。视频导出为 2245 个 TIFF 图像(约 6.2GB),没有关于重复帧的消息。

选项 2来源
评论:它使用过滤器重新定时帧setpts
命令ffmpeg -i input.mp4 -vf mpdecimate,setpts=N/24/TB -vsync vfr $filename%05d.tiff
结果:它有效。视频导出为 2245 个 TIFF 图像(约 6.2GB),没有关于重复帧的消息。根据来源,最终的帧率为 24 FPS(符合 OP 的要求),但这不是我需要的。我需要尊重原始视频的 FPS(如果可能的话)。

选项 3来源
评论:这使输入和输出帧之间保持 1:1 的对应关系。
命令ffmpeg -i input.mp4 -vsync passthrough $filename%05d.tiff
结果:成功了。视频导出为 2246 张 TIFF 图像(约 6.2GB),没有关于重复帧的消息。

奇怪的是(至少对我来说)所有 3 个选项都生成完全相同的 TIFF 文件,每个文件大小为 2.8 MiB(我甚至按内容比较了几个随机对,文件实际上是相同的,只是选项 3 比选项 1 和 2 多生成 1 个文件)。

相关内容