基本上我有一个包含数百个视频文件(* .avi)的文件夹,每个视频文件一个小时或多或少一个小时。我想要实现的是一段代码,可以遍历每个视频,然后从每个文件中随机选择两个或三个帧,然后将它拼接在一起,或者另外将文件夹中的帧保存为jpeg。 最初我以为我可以用R做到这一点,但很快我意识到我需要其他可能与R一起工作的东西。
是否可以从R调用FFMPEG来执行上述任务?
我已经在互联网上寻找可以帮助我开始的事情,但我发现的大部分内容都过于具体,非常适合我需要做的事情。
有人可以帮助我,或者只是指出我正确的方向。
非常感谢
答案 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内部进行这些计算。