从多个文件中随机提取视频帧

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() 调用进行这些计算。

【讨论】:

以上是关于从多个文件中随机提取视频帧的主要内容,如果未能解决你的问题,请参考以下文章

从视频中提取帧的最快方法

ffmpeg_拼接并提取flv视频文件中的音频生成mp3文件

PHP从文件夹中提取随机图像

如何在Bash中提取多个唯一子字符串

从在线pdf文件中提取文本(sharepoint)

从视频文件中提取wav文件