Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Randomly extract video frames from multiple files [closed]

I have a folder with hundreds of video files (*.avi), each one with more or less an hour long. What I would like to achieve is a piece of code that could go through each one of those videos and randomly select two or three frames from each file and then stitch it back together or alternatively save the frames in a folder as jpegs.

Initially I thought I could do this using R but quickly I've realised that I would need something else possibly working together with R.

Is it possible to call FFMPEG from R to do the task above?

like image 702
PatraoPedro Avatar asked May 01 '26 20:05

PatraoPedro


1 Answers

I had a related question here recently, and found it was more straightforward to do this in bash, if you're using a Unix system.

Something like this worked for me:

#!/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

Basically, for each .avi in the directory, the number of frames and FPS is calculated. Then, three random frames are extracted as a .jpg using the $RANDOM function in bash and feeding the random frame into ffmpeg as a hh:mm:ss time by dividing RANDOM_FRAME by FPS.

You could always do these calculations from inside R with system() calls if you're not familiar with bash lingo.

like image 199
jogall Avatar answered May 03 '26 15:05

jogall