Home > Blockchain >  FFmpeg - divide single .webm video into multiple videos (each representing part of the screen) speci
FFmpeg - divide single .webm video into multiple videos (each representing part of the screen) speci

Time:05-24

Can FFmpeg divide one big rectangular video into x smaller rectangular ones? What would be a command for it?

Can we parametrize the command with number of rows and columns we desire?

Can we somehow prevent loosing pixel precision when command is provided with improper rows/column count for source video resolution?

CodePudding user response:

This script does the job:

inputFile=$1
rows=$2
columns=$3
counter=0

for((r=0; r<$rows; r  ))
do
    for((c=0; c<$columns; c  ))
    doinputFile=$1
        ffmpeg -i $inputFile -filter:v "crop=iw/$columns:ih/$rows:$c* 
(iw/$columns):$r*(ih/$rows)" -vcodec libvpx -crf 5 -b:v 10M -an 
"$(dirname "$inputFile")/$(basename "$inputFile" ".webm")$counter.webm"
        ((counter=counter 1))
    done
done

CodePudding user response:

There is a single-call solution to do single-in multiple-out like this:

ffmpeg -i inputFile \
  -vsync vfr \
  -filter_complex [0:v]untile=$ncolsx$nrows:$nout,select=mod(n\,$nout) 1:$nout[v1][v2][v3]...[v$nout] \
  -map [v1] -r $fps output1.webm \
  -map [v2] -r $fps output2.webm \
  ...
  -map [v$nout] -r $fps output$nout.webm

Here, $nout = $ncols * $nrows and you need to set the output framerate $fps explicitly (or it defaults to $input_fps * $nout).

Accordingly, you can run your nested loops to form the FFmpeg command argument string, and call it once after the loop. Note that my use of pseudo-variables $xxx is not adhering to any language so please make necessary adjustments.

  • Related