ffmpeg:在视频的%位置选择帧

Mat*_*ner 12 ffmpeg

我正在尝试创建视频的2x2平铺缩略图,其中包含通过视频的20%,40%,60%和80%的帧.我看到我需要使用带有select的视频过滤器,但无法确定哪些选项可以执行此操作.我想做这样的事情:

ffmpeg -i video.avi -frames 1 -vf "select=not(mod(pos\,0.2)),tile=2x2" tile.png
Run Code Online (Sandbox Code Playgroud)

位置将是视频中从0.0到1.0的位置.我该怎么做,或者我有什么选择?

aer*_*tal 15

  • 方法1:帧间隔

    这可能需要一些时间,具体取决于N/A某些类型输入的输入或返回(在这种情况下参见基于持续时间的方法).

    获取总video帧数:

    ffprobe <input> -select_streams v -show_entries stream=nb_frames -of default=nk=1:nw=1 -v quiet
    
    Run Code Online (Sandbox Code Playgroud)

    该命令将输出一个整数值,例如:

    18034
    
    Run Code Online (Sandbox Code Playgroud)

    对于上面的示例,帧间隔是 nb_frames / 5 = 18034 / 5 = 3607

    最后ffmpeg命令是:

    ffmpeg -i <input> -filter:v "select=(gte(n\,3607))*not(mod(n\,3607)),tile=2x2" -frames:v 1 -vsync vfr -y tile.png
    
    Run Code Online (Sandbox Code Playgroud)
  • 方法2:持续时间间隔

    与上述相同,但使用持续时间(秒).这也可能需要一段时间,报告的持续时间可能无效(例如:如果文件被截断).

    ffprobe <input> -select_streams v -show_entries stream=duration -of default=nk=1:nw=1 -v quiet
    
    Run Code Online (Sandbox Code Playgroud)

    它返回一个真实值,如:

    601.133333
    
    Run Code Online (Sandbox Code Playgroud)

    你的间隔是601 / 5 ~= 120秒:

    ffmpeg -i <input> -filter:v "select=(gte(t\,120))*(isnan(prev_selected_t)+gte(t-prev_selected_t\,120)),tile=2x2" -frames:v 1 -y tile.png
    
    Run Code Online (Sandbox Code Playgroud)
  • 方法3:寻求和提取

    寻找特定时间-ss -i,提取单个帧并使用imagemagick montage来创建图块.

    10分钟倒计时器的示例输出:

    在此输入图像描述

  • 没有阅读整个文件就没有办法做到这一点?`-i`之前`-ss`的方式呢? (2认同)