从多个文件中随机提取视频帧
Posted
技术标签:
【中文标题】从多个文件中随机提取视频帧【英文标题】:Randomly extract video frames from multiple files 【发布时间】:2014-09-30 22:47:00 【问题描述】:基本上我有一个包含数百个视频文件 (*.avi) 的文件夹,每个文件或多或少一个小时。我想要实现的是一段代码,它可以遍历这些视频中的每一个,并从每个文件中随机选择两个或三个帧,然后将它们缝合在一起,或者将这些帧作为 jpegs 保存在文件夹中。 最初我认为我可以使用 R 来做到这一点,但很快我意识到我需要其他可能的东西与 R 一起工作。
是否可以从 R 中调用 FFMPEG 来完成上述任务?
我在互联网上搜寻可以帮助我开始的事情,但我发现的大部分内容都过于具体,并且确实适用于我需要做的事情。
任何人都可以帮助我或简单地指出我正确的方向。
非常感谢
【问题讨论】:
一个示例命令是:ffmpeg -ss 00:03:24 -i input -frames:v 1 -qscale:v 2 output.jpg
。您可以获取输入持续时间,如FFprobe Tips 所示。由您决定如何编写脚本。
【参考方案1】:
我最近有一个相关的问题here,发现如果您使用的是 Unix 系统,在 bash 中执行此操作更简单。
我可能会因为在此处发布此答案而被遗忘,因为它与 R 无关,但我希望它有所帮助。这样的事情对我有用:
#!/bin/bash
for i in *.avi
do TOTAL_FRAMES=$(ffmpeg -i $i -vcodec copy -acodec copy -f null /dev/null 2>&1 | grep frame | cut -d ' ' -f 1 | sed s/frame=//)
FPS=ffmpeg -i 18_1*avi -vcodec copy -acodec copy -f null /dev/null 2>&1 | grep fps | cut -d ' ' -f 2 | sed s/fps=//
for j in 1..3
do RANDOM_FRAME=$[RANDOM % TOTAL_FRAMES]
TIME=$((RANDOM_FRAME/FPS))
ffmpeg -ss $TIME -i $i -frames:v 1 $i_$j.jpg
done
done
基本上,对于目录中的每个.avi,都会计算帧数和FPS。然后,使用 bash 中的 $RANDOM
函数将三个随机帧提取为 .jpg 并通过将RANDOM_FRAME
除以FPS
将随机帧作为hh:mm:ss
时间输入ffmpeg
。
如果您不熟悉 bash 术语,您总是可以在 R 内部使用 system()
调用进行这些计算。
【讨论】:
以上是关于从多个文件中随机提取视频帧的主要内容,如果未能解决你的问题,请参考以下文章