Announcing https://github.com/danielsz/bioscoop, a DSL for FFmpeg Why? The short answer: because FFmpeg syntax is nuts. The long answer: because FFmpeg's own DSL is a thin layer on top of`libavfilter`. It is a string-only representation: the filtergraph is essentially "write-only" code. There is no composition mechanism, no type checking, and no ability to introspect the graph structure before execution. The longer answer: https://danielsz.github.io/bioscoop/#orgfab16a2 and the https://danielsz.github.io/bioscoop/#orgdb665f9. Who is this for? The short answer: me. A slightly less short answer: the creative coding community. Bonus point for Clojure natives. The long answer may be found in the https://github.com/danielsz/bioscoop. On October 18th, I will give a talk on the topic of Bioscoop at https://scicloj.github.io/macroexpand-2025/macroexpand_noj.html. In particular, I will explain how Bioscoop manages to be both an internal DSL and an external one sharing a single transformation pipeline. I hope to see you there!
As someone who struggled in the past with ffmpeg calls from Clojure, this is really cool! Great job on the implementation!
And love the Dutch name! 🇳🇱
[Rich Hickey mode] Bioscoop root is from the Greek words 'bios' meaning life and 'Skopein' meaning to look or to see
learned something new today!
Bioscoop looks excellent. I will use it to help with generating cycling data overlays on my long distance cycle ride videos.
That sounds like a cool use case!
Awesome, cant wait to try some ken burns fx on my paintings. Do you think it could be used in conjunction with clj media (bindings for ffmpeg native api) @smith.adriane any thoughts? https://github.com/phronmophobic/clj-media https://phronmophobic.github.io/clj-media/
I think there's a function that creates a filtergraph from a string available, but I don't think it's exposed currently. However, many filters are already made available (https://phronmophobic.github.io/clj-media/reference/com.phronemophobic.clj-media.avfilter.html). There are a few examples https://phronmophobic.github.io/clj-media/#examples.
Funny you mention Ken Burns. I started this project because I wanted to present photography work with intricate transitions (including zooming and panning). (Which gets unwieldy quick in FFmpeg's syntax). The latest link in the README points to that https://www.youtube.com/watch?v=CWdZ3-Xh3vQ written as a Bioscoop program. For those who don't know who Ken Burns is: he is a documentarian covering periods in history for which photographic archives exist but not their film counterpart. So he came up with a technique to animate the source material. That technique spread because zooming and panning in still images makes so much sense in all sorts of contexts. Steve Jobs famously asked Burns for permission to name the effect for iMovie.
Bioscoop emits a FFmpeg's filtergraph. This is normally the hard part. Once you have a working filtergraph, it becomes trivial to feed it to FFmpeg (or indeed any third-party tool that understands FFmpeg's filtergraphs).
@danielsz Congratulations on the release. Looking forward to the Macroexpand talk.
https://clojurians.slack.com/archives/CLDK6MFMK/p1760419966575209