【问题标题】:FFmpeg extract N images from a videoFFmpeg 从视频中提取 N 个图像
【发布时间】:2018-09-21 09:59:05
【问题描述】:

我一直在到处寻找如何使用 FFmpeg 从视频中提取 N 个图像。所有答案都涉及使用速率设置(-r)。但是,我在汇率方面遇到了一些基本问题。根据文档,以下内容应每秒产生一帧。

ffmpeg -i input.mov -f image2 -r 1 preview-%d.jpeg

如果 input.mov 的长度为 7 秒,我希望得到 7 张图片。但是,我得到了 10 个。我还尝试了一个 119 秒长的视频,但我得到了 122 个图像。我收到的图片比预期的多 3 张。我错过了什么?

例如,在这个约 3 秒的视频中,我得到了 6 帧 https://www.dropbox.com/s/8eke6q2gz1kgk1f/example.mov?dl=0

benblack$ ffmpeg -i example.mov -f image2 -r 1 preview-%d.jpeg
ffmpeg version 2.1.4 Copyright (c) 2000-2014 the FFmpeg developers
  built on Mar  2 2014 13:38:24 with Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/2.1.4 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --enable-avresample --enable-vda --cc=clang --host-cflags= --host-ldflags= --enable-libx264 --enable-libfaac --enable-libmp3lame --enable-libxvid
  libavutil      52. 48.101 / 52. 48.101
  libavcodec     55. 39.101 / 55. 39.101
  libavformat    55. 19.104 / 55. 19.104
  libavdevice    55.  5.100 / 55.  5.100
  libavfilter     3. 90.100 /  3. 90.100
  libavresample   1.  1.  0 /  1.  1.  0
  libswscale      2.  5.101 /  2.  5.101
  libswresample   0. 17.104 /  0. 17.104
  libpostproc    52.  3.100 / 52.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'example.mov':
  Metadata:
    major_brand     : qt
    minor_version   : 0
    compatible_brands: qt
    creation_time   : 2015-02-11 16:52:01
  Duration: 00:00:02.83, start: 0.000000, bitrate: 736 kb/s
    Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709), 638x468 [SAR 1:1 DAR 319:234], 726 kb/s, 59.29 fps, 60 tbr, 6k tbn, 12k tbc (default)
    Metadata:
      creation_time   : 2015-02-11 16:52:01
      handler_name    : Core Media Data Handler
[swscaler @ 0x7fdb13008c00] deprecated pixel format used, make sure you did set range correctly
Output #0, image2, to 'preview-%d.jpeg':
  Metadata:
    major_brand     : qt
    minor_version   : 0
    compatible_brands: qt
    encoder         : Lavf55.19.104
    Stream #0:0(und): Video: mjpeg, yuvj420p, 638x468 [SAR 1:1 DAR 319:234], q=2-31, 200 kb/s, 90k tbn, 1 tbc (default)
    Metadata:
      creation_time   : 2015-02-11 16:52:01
      handler_name    : Core Media Data Handler
Stream mapping:
  Stream #0:0 -> #0:0 (h264 -> mjpeg)
Press [q] to stop, [?] for help
frame=    6 fps=0.0 q=0.0 Lsize=N/A time=00:00:06.00 bitrate=N/A dup=0 drop=162
video:283kB audio:0kB subtitle:0 global headers:0kB muxing overhead -100.007598%

【问题讨论】:

  • 一个 7 秒的视频你应该得到 8 张图片。您应该在零秒时计算一张图像。
  • 请显示完整的、未删减的命令行输出,最好也提供一个示例文件。

标签: ffmpeg


【解决方案1】:

我不知道为什么 -r 没有产生我期望的结果。但是,我设法使用 -vf 和 -vsync 提取了 N 帧:

ffmpeg -i example.mov -f image2 -vsync vfr -vf "select='not(mod(n,17)')" -vframes 10 preview-%d.jpeg

round(视频中的帧数/想要的帧数) = 168/10 = 17。视频中的帧数可以使用ffprobe找到:

ffprobe -v error -select_streams v:0 -show_entries stream=nb_frames -i example.mov

vframes 设置是为了限制帧数,因为由于舍入,我们有时可能会多生成一帧。

【讨论】:

【解决方案2】:

另一种从视频中提取图像的流行方法是每秒一帧。

如果您想从视频中提取一部分图像,请使用 -ss 选项指定起始时间戳,并使用 -t 指定编码持续时间的选项,例如从 52 秒到 1 分 5 秒:

ffmpeg.exe -i simpsonsRockBottom.mp4 -ss 00:00:52 -t 00:01:05 -r 1/1 $filename%03d.jpg
  • 时间戳需要采用 HH:MM:SS.xxx 格式或以秒为单位。

  • 如果您不指定 -t 选项,它将转到最后。

【讨论】:

  • 尾随选项,例如您的-ss-t,可以被ffmpeg 忽略。选项的顺序很重要:ffmpeg [input options] -i input [output options] output
  • 我会相信你的话,我用尾随 -ss 和 -t 对其进行了测试,并且成功了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-26
  • 2012-01-30
  • 2016-06-24
相关资源
最近更新 更多