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

时间:2014-08-07 15:48:14

标签: r video ffmpeg extraction avi

基本上我有一个包含数百个视频文件(* .avi)的文件夹,每个视频文件一个小时或多或少一个小时。我想要实现的是一段代码,可以遍历每个视频,然后从每个文件中随机选择两个或三个帧,然后将它拼接在一起,或者另外将文件夹中的帧保存为jpeg。 最初我以为我可以用R做到这一点,但很快我意识到我需要其他可能与R一起工作的东西。

是否可以从R调用FFMPEG来执行上述任务?

我已经在互联网上寻找可以帮助我开始的事情,但我发现的大部分内容都过于具体,非常适合我需要做的事情。

有人可以帮助我,或者只是指出我正确的方向。

非常感谢

1 个答案:

答案 0 :(得分:3)

我最近遇到了一个相关的问题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,并通过将ffmpeg除以{{hh:mm:ss,将随机帧投放到RANDOM_FRAME FPS时间1}}。

如果您不熟悉bash术语,您可以随时通过system()来自R内部进行这些计算。