使用FFmpeg的视频有意义的缩略图

分享于 

6分钟阅读

电脑

 

问题:

FFmpeg可以捕获视频中的图像,这些图像可以用作代表视频的缩略图。 最常见的方法是在中捕获。

但是我不想在一段时间内随意挑选。 我在FFmpeg上找到了一些使用过滤器来捕获场景更改的选项:

过滤器 thumbnail 试图在视频中找到最有代表性的帧:


ffmpeg -i input.mp4 -vf"thumbnail,scale=640:360" -frames:v 1 thumb.png



以前的( 所以可能是场景变化) 相比,以下命令只选择具有 40%个上更改的帧,并生成 5 png序列。


ffmpeg -i input.mp4 -vf"select=gt(scene,0.4),scale=640:360" -frames:v 5 thumb%03d.png



上命令的信息为 Sonnati。 第二个看起来更好,因为我可以得到n 图像和挑选最好的。 我尝试了它,它产生了同样的图像 5倍。

更多调查使我了解到:


ffmpeg -i input.mp4 -vf"select=gt(scene,0.5)" -frames:v 5 -vsync vfr out%02d.png



-vsync vfr 确保你获得不同的图像。 在大多数情况下,这仍然是视频的第一帧,大多数情况下第一帧是片尾/logo,而不是有意义的,所以我添加了一个 -ss 3来丢弃视频。

我的最终命令如下所示:


ffmpeg -ss 3 -i input.mp4 -vf"select=gt(scene,0.5)" -frames:v 5 -vsync vfr out%02d.jpg



我只能尽力而为了. 我注意到,由于我选择了 5个视频,所有它们大多是从视频开始并在视频后面出现。

我想为你的大脑选择其他更好的选择。


回答 1:

寻找最理想的方法是在每 5个时间范围内的第一个> 40%-change帧,其中时间跨度为 1,2,3,4和 5th,视频的。

你也可以将它分割成 6个时间跨度,忽略 1st 个,避免。

实际上,这意味着在应用场景变更检查和参数的时候,这就意味着将sparc设置为低数。

"。"。比如:


ffmpeg -ss 3 -i input.mp4 -vf"select=gt(scene,0.4)" -frames:v 5 -vsync vfr -vf fps=fps=1/600 out%02d.jpg




回答 2:

如果你想让我在整个视频文件中有效地生成N 个缩略图,那么你就可以用用户上传的内容生成缩略图。

伪代码

for X in 1..N


 T = integer( (X - 0.5) * D/N ) 


 run `ffmpeg -ss <T> -i <movie>


 -vf select="eq(pict_type,I)" -vframes 1 image<X>.jpg`



其中:

  • D - 单独从 ffmpeg -i <movie> 读取视频持续时间或者 ffprobe,它有很好的JSON输出编写器
  • N - 你想要的缩略图总数
  • X - 缩略图编号,从 1到N
  • T - tumbnail的时间点

简单地写下电影每个分区的中键帧。 如果电影是长,你想要 3个缩略图,那么它在 50.150s 和 250秒后就会有一个关键帧。 对于 5个缩略图,它将是 30,90,150,210,270. 你可以根据电影持续时间调整N,即 比如 5分钟电影将有 3个缩略图,但超过 1小时将有 20个缩略图。

效率

每次调用 ffmpeg 命令的第二个( ) 是 ~1GB H.264.的一部分,它是因为它立即跳到 <time> 位置(。-i 前的-ss )。 将电影精确地渲染到 MATCH的时间位置没有浪费时间。

后处理

你可以使用 scale 或者任何其他调整大小方法进行混合。 你还可以删除纯色框或者尝试将它的与其他过滤器( 如 thumbnail ) 混合。


回答 3:

我曾经做过类似的事情,但是我导出了视频( 在 1秒)的所有框架,并将它们与一个perl实用工具相比较,我。 比较每个帧到前面的缩略图,如果不同于所有缩略图,我将它添加到缩略图集合中。 这里的优点是,如果视频从场景A 到B,他们返回A,则rtc将导出 2帧。


回答 4:

试试这个


 ffmpeg -i input.mp4 -vf fps= no_of_thumbs_req/total_video_time out%d.png



使用这个命令,我可以生成所需的缩略图数量,这些缩略图代表整个视频。


回答 5:

以下是我为生活m3u8流生成的一个周期缩略图,用作海报。 我发现运行连续的tftp任务只是为了生成缩略图消耗所有 CPU,所以每 60秒运行一个 cronjob。


#!/usr/bin/env bash



## this is slow but gives better thumbnails (takes about 1+ minutes for 20 files)


#-vf thumbnail,scale=640:360 -frames:v 1 poster.png



## this is faster but thumbnails are random (takes about 8 seconds for 20 files)


#-vf scale=640:360 -frames:v 1 poster.png


cd ~/path/to/streams



find. -type f 


 -name"*.m3u8" 


 -execdir sh -c 'ffmpeg -y -i"$0" -vf scale=640:360 -frames:v 1"poster.png"' 


 {} ;



在脚本中,如果需要执行比1 秒更频繁的操作,那么可以在脚本中执行一个 while 循环,并且它将永远执行。 只需添加 sleep 30 即可将频率更改为 30秒。 不过我不建议大量的视频做这个,因为前一个运行在下一个开始之前不能完成。

最理想的是cronjob我每隔 5分钟运行一次。



视频  Thumb  Ffmpeg  MEAN  缩略图  
相关文章