
Ffcms – FFmpeg's -filter_complex made simple - stryku2393
http://stryku.pl/poetry/ffcms.html
======
transitivebs
This is really awesome -- FFmpeg's filter_complex is powerful and
appropriately named "complex" lol.

I built and sold a company built largely around FFmpeg and this type of tool
would've been really useful for understanding how FFmpeg's filter chain works.
If you're interested in some non-trivial OSS examples, check out
[https://github.com/transitive-bullshit/ffmpeg-gl-
transition](https://github.com/transitive-bullshit/ffmpeg-gl-transition) and
[https://github.com/transitive-bullshit/ffmpeg-
concat](https://github.com/transitive-bullshit/ffmpeg-concat).

One non-obvious piece of advice I have for developers delving into ffmpeg's
filter_complex is to try and keep the filter graphs as short and simple as
possible. Creating complex filter graphs programmatically (as ffcms does in
this case) is super powerful, but I've also found in practice that larger
filter graphs often lead to random, impossible to debug errors. This could be
due to anything from some combination of VM resource constraints, internal
ffmpeg leaks that compound at scale, etc etc.

My advice is to think carefully about what you want to use ffmpeg for. It's
_excellent_ at transcoding and doing minor filter graphs but trying to get too
crazy with complex filter graphs will lead you down a dark path that imho
ffmpeg wasn't really meant for. If you can break up your complex filter
effects into smaller, isolated ffmpeg commands it may be slightly slower but
your rendering pipeline will be significantly more robust.

~~~
stryku2393
Glad to hear that you like it (:

Thank you for the links. I'll check them out.

Aaand of course, thanks for the advice. Personally, I've never been in a
situation where `filter_complex` caused problems. But, I've never done some
weird filtering there too, so you may be right.

I'm not saying that now, with ffcms, you should write JSONs that produce an A4
ffmpeg command. If you're doing so, something is not right.

For now, it's just a tool that helps me with timelapse creation for my
fiancée. Let's see how it evolves.

~~~
transitivebs
That's an awesome use case I hope your fiancee appreciates all your hard work
haha.

------
_Gyan_
" _-f lavfi -i testsrc - declaration of an input. The input format is lavfi,
the input file is testsrc. This is duplicated four times to imitate four
different inputs._ "

You can feed a single input multiple times in a filtergraph, so you can make
do with only one. In this case, it hardly matters, but the input packet will
be demuxed and decoded only once, unlike in the examples.

~~~
stryku2393
True, but I wanted to stick to the official example.

------
nness
I spent quite a while trying to replace the syntax of FFmpeg's filter-graphs
with a tree-structure of nodes. Then about a week in I remembered why you
should never build a DSL over a DSL.

I personally find the FFmpeg syntax to not need further abstraction. There's
more than a few projects that try and replace the graph and they'll be stuck
trying to keep pace with version creep.

~~~
bilekas
> Then about a week in I remembered why you should never build a DSL over a
> DSL

Yes.. I was very excited to do the same, even automate it in a way.

It's a tool that is (IMO) impossible to automate.. Making it easier is project
dependent... But it wont translate for someone else usually.

------
mappu
Ffmpeg's built-in filtering has gotten a lot more advanced since i last
looked. Is it possible to use this as a full/near-full avisynth replacement?

Is it possible to compile avisynth code down to a filter_complex statement?

Is anyone using Vapoursynth?

------
jbverschoor
Thank you. Very welcome addition. You could of course use a script for that,
but that requires more effort / is more difficult for a lot of people to
understand.

I hope there will be a similar structure (or DSL) for imagemagick, as it's it
has the same difficulties.

~~~
bilekas
I can say from experience of my own and others, that people usually keep these
close to their chest, I consider mine a bible. In fairness, its a tool, so
what you do with it is up to you. It's really hard to organise a standard
library for even video work as each source is always a bit different, given
the amazing community aroudn questions and answers I suspspect nobody wants to
have a standard the same as ImageMagic.. It really is a different beast.

Edit : With certain frames, certain 'standards' settings would not result the
same, so.. It's really impossible to have 1.

You might have 1 clip which requires 2 entirely different settings.

------
feinte
This FFmpeg Python bindings [0] provides wrapper for filter_complex which
simplifies its use a lot !

[0]: [https://github.com/kkroening/ffmpeg-
python](https://github.com/kkroening/ffmpeg-python)

~~~
stryku2393
That's actually awesome. Didn't know about this feature but I'll take a look
for sure.

------
leshokunin
Love it. FFmpeg is so powerful, but so opaque. I think there could be a whole
vertical of startups dedicated to tooling built to simplify using it. Looking
forward to seeing this develop.

~~~
phendrenad2
There definitely are. There are video transcode SaaS platforms which wrap
something (maybe FFMPEG) in a nice REST API.

------
ape4
Too bad its using JSON. There are lots of other cleaner formats like YAML,
RJSON, etc

~~~
speedgoose
I feel like JSON is a fair choice these days. More people would dislike some
YAML IMHO.

~~~
DarthGhandi
Anything that's going to be handwritten shouldn't be using json, it's
unnecessarily verbose to read and produce

I personally prefer toml

~~~
stryku2393
I thought about TOML for a while. Went with JSON because I just wanted to
start working.

Like I said in one of the comments, final decision has not been made yet. JSON
is not written in stone, plus ffcms could support more than one language, e.g.
JSON and TOML.

