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