What do you mean? FFMpeg supports filters via its own DSL; see
https://ffmpeg.guide/ or
https://ffmpeg.org/ffmpeg-filters.htmlIt's not quite JSON and I have to look up the syntax every time I use it, but it's well-defined.
The general syntax is:
[input1][input2]... filterchain [output1];
[input3] filterchain [output2];
...
to specify chains of filters that link input streams to output streams.
For example, the following:
ffmpeg -i INPUT -vf "
split [main][tmp];
[tmp] crop=iw:ih/2:0:0, vflip [flip];
[main][flip] overlay=0:H/2
" OUTPUT
is doing something like this (python pseudocode):
main,tmp = input.split(2)
flip = (tmp
.crop(iw, ih/2, 0, 0)
.vflip())
out = overlay([main, flip], 0, H/2)
Here's a more complicated example (visualization on
https://ffmpeg.guide/graph/demo ):
ffmpeg -i ./long-video.mp4
-i ./background-music.mp3
-filter_complex "[0:v]trim=duration=30[out0];
[0:a]atrim=duration=15[out1];
[out1][1:a]
amix=inputs=2:duration=longest:
dropout_transition=2:weights=1 1:
normalize=1
[out2]"
-map "[out0]" -map "[out2]"
./shorter-video.mp4
Pseudocode:
# input files (-i options)
in0 = read("./long_video.mp4")
in1 = read("./background_music.mp3")
# filter graph
out0 = in0.video.trim(duration=30)
out1 = in0.audio.trim(duration=15)
out2 = amix([out1, in1.audio],
duration="longest", dropout_transition=2,
weights=[1,1], normalize=1)
# output stream mapping
out_stream[0] = out0
out_stream[1] = out2