[HN Gopher] Drawvg Filter for FFmpeg
       ___________________________________________________________________
        
       Drawvg Filter for FFmpeg
        
       Author : nolta
       Score  : 167 points
       Date   : 2026-03-17 15:16 UTC (3 days ago)
        
 (HTM) web link (ayosec.github.io)
 (TXT) w3m dump (ayosec.github.io)
        
       | torginus wrote:
       | One of the strangest discoveries of my life was that vector
       | graphics is a solved problem, and the solution is turtle graphics
       | that I was taught in primary school.
        
         | ErroneousBosh wrote:
         | I still have a copy of Hobby Electronics from 1982 that my dad
         | bought when I was about 9 or so and in primary school, with the
         | article on building Hebot II.
         | 
         | I got various bits and pieces together and experimented with
         | doing things like driving Big Trak gearboxes (remember? J Bull
         | Electrical used to advertise them in every magazine, along with
         | all sorts of fascinating old shite) with an interface plugged
         | into my ZX Spectrum, but I never actually built one.
         | 
         | Funnily enough I was thinking about that the other day, and how
         | sad it is that schools like my son's primary school just have
         | very locked-down iPads for the children to use instead of the
         | BBC Micros we grew up with (I'm guessing you're more
         | approximately my age than primary school age, and those things
         | were in schools well into the early 2000s. Bombproof.) that
         | could be endlessly tinkered with.
         | 
         | Anyway the guy next door does a lot of 3D printing and it's
         | never been easier to draw PCBs and get them made or even etch
         | them at home (it's the drilling bit I hate). So maybe now
         | EBv2.0 is five, it's time to dig out that issue of HE and start
         | transcribing stuff into Kicad and Blender :-)
        
         | severak_cz wrote:
         | Well turtle graphics is not implemented in drawvg. But it
         | should be easy to implement it.
        
           | speps wrote:
           | SVG path syntax [1] mentioned as being an inspiration in the
           | article is very similar to Turtle graphics (move, lineto,
           | etc.)
           | 
           | [1] https://developer.mozilla.org/en-
           | US/docs/Web/SVG/Reference/E...
        
             | masfuerte wrote:
             | Very many vector graphics standards use the idea of a
             | current position. A distinguishing feature of turtle
             | graphics is to have a current direction as well.
             | 
             | It's a shame SVG doesn't. Many shapes can be specified much
             | more concisely.
        
               | Zardoz84 wrote:
               | plotter languages have the same concept.
        
               | masfuerte wrote:
               | Which ones? I've just skimmed through docs for HP-GL,
               | DMPL and Gerber, but I can't see anything.
        
         | boutell wrote:
         | I was trying to do a bit of generative art for a pixel display
         | in my window, and feeling creatively stuck, then realized I
         | wanted turtle graphics. Implemented that and I was unlocked.
        
         | IshKebab wrote:
         | This doesn't make any sense. Vector graphics aren't specified
         | by rotating and walking a turtle, and that is obviously a tiny
         | tiny trivial part of the vector graphics field. Try rendering a
         | vector font directly on a GPU and see how far RIGHT 45 FORWARD
         | 10 gets you.
        
       | shevy-java wrote:
       | That's quite cool. I guess ffmpeg would kind of technically be a
       | replacement for avisynth at this point.
       | 
       | Still, I find the syntax it uses horrible:                 ffmpeg
       | -an -ss 12 -t 3 -i bigbuckbunny.mov -vf 'crop=iw-1,
       | drawvg=file=progress.vgs, format=yuv420p' -c:v libvpx-vp9
       | output.webm
       | 
       | I understand that most of this comes from simplicity of use from
       | the shell, so if you take this point of view, the above makes a
       | lot of sense.
       | 
       | My poor, feeble brain, though, has a hard time deducing all of
       | this. Yes, I can kind of know what it does to some extent ...
       | start at 12 seconds right? during 3 seconds ... apply the
       | specified filter in the specified format, use libvpx-vp9 as the
       | video codec ... but the above example is somewhat simple. There
       | are total monsters in actual use when it comes to the filter
       | subsystem in ffmpeg. Avisynth was fairly easy on my brain; ffmpeg
       | does not, and nobody among the ffmpeg dev team seems to think
       | that complicated uses are an issue. I even wrote a small ruby
       | script that expands shortcut options as above, into the
       | corresponding long names, simply because the long names are a bit
       | easier to remember. Even that fails when it comes to complex
       | filters used.
       | 
       | It's a shame because ffmpeg is otherwise really great.
        
         | jack_pp wrote:
         | Maybe it helps to view ffmpeg as a DSL and the ugliness is
         | caused by the CLI constraints / conventions.
         | 
         | For what it's worth, LLMs are a great tool for both composing
         | and understanding ffmpeg commands.
         | 
         | And if you want something more verbose / easier to read you can
         | use something like https://github.com/kkroening/ffmpeg-python
         | (with LLMs) as well
        
           | argsnd wrote:
           | It looks like that project is dead, some googling turned up
           | this one which seems active and popular
           | 
           | https://github.com/pyav-org/pyav
        
             | jack_pp wrote:
             | They are not comparable, ffmpeg-python just abstracts away
             | the CLI, pyav is a low level binding of the ffmpeg libs.
             | 
             | It may seem "dead" but ultimately it just helps you build
             | CLI commands in a more sane way, the CLI interface to
             | ffmpeg has been consistent for a long time. Only thing that
             | may change is individual filters which you can just give
             | raw to ffmpeg-python.
             | 
             | I remember when I was heavily using it last year I found a
             | fork that seemingly had more sane typing or something but
             | since LLMs last year didn't know about the newer lib but
             | could write decent ffmpeg-python code I stuck with it and
             | it did the job.
        
       | fercircularbuf wrote:
       | This could be a great and easy way to add annotations to
       | technical instruction videos in a way that is self-documenting
       | and programmable.
        
       | jasode wrote:
       | drawvg is very useful. Before drawvg, I was always fine using the
       | stable FFmpeg releases such as 8.0.1 but when I saw drawvg added
       | to the master branch[1], I didn't want to wait for the next
       | stable release and immediately re-built ffmpeg from master to
       | start using it.
       | 
       | My main use case is modifying youtube videos of tech tutorials
       | where the speaker overlays a video of themselves in a corner of
       | the video. drawvg is used to blackout that area of the video. I'm
       | sure some viewers like having a visible talking head shown on the
       | same screen as the code but I find the constant motion of
       | someone's lips moving and eyes blinking in my peripheral vision
       | extremely distracting. Our vision is very tuned into paying
       | attention to faces so the brain constantly fighting that urge so
       | it can concentrate on the code. (A low-tech solution is to just
       | put a yellow sticky know on the monitor to cover up the speaker
       | but that means you can't easily resize/move the window playing
       | the video ... so ffmpeg to the rescue.)
       | 
       | If the overlay was a rectangle, you can use the older drawbox
       | filter and don't need drawvg. However, some content creaters use
       | circles and that's where drawvg works better. Instead of creating
       | a separate .vgs file, I just use the inline syntax like this:
       | ffmpeg -i input.webm -filter_complex "[0:v]drawvg='circle 3388
       | 1670 400 setcolor black fill'[v2];[0:a]atempo=1.5[a2]" -map
       | "[v2]" -map "[a2]" output.mp4
       | 
       | That puts a black filled circle on the bottom right corner of a
       | 4k vid to cover up the speaker. Different vids from different
       | creators will require different x,y,radius coordinates.
       | 
       | (The author of the drawvg code in the git log appears to be the
       | same as the author of this thread's article.)
       | 
       | [1]
       | https://git.ffmpeg.org/gitweb/ffmpeg.git/commit/016d767c8e9d...
        
         | amlib wrote:
         | Couldn't you use a video player like mpv to achieve a similar
         | effect? Not sure if you can cover a specific part of the image
         | but you sure can crop the video however you want and bind the
         | commands/script to a key.
        
           | jasode wrote:
           | _> mpv to achieve a similar effect? Not sure if you can cover
           | a specific part of the image but you sure can crop the video
           | _
           | 
           | mpv doesn't run on iPad so it's better for my situation to
           | just burn the blackout into a new video. I actually do a lot
           | more stuff than drawvg (also rescale, pts, framerate,etc) in
           | filter_complex but left the rest of it out for the HN comment
           | so the example is more readable.
           | 
           | I suppose it might be possible to use mpv with a custom
           | shader mask glsl code to blackout circular areas of the
           | screen.
           | 
           |  _> you sure can crop the video _
           | 
           | Cropping the video is straightforward with no information
           | loss when the geometry of presentation and the speaker is
           | laid out like these:
           | https://www.youtube.com/@MeetingCPP/videos
           | 
           | But cropping the following video by shrinking the boundaries
           | of the rectangle until the circle overlay is not visible
           | would result in too much of the text being cut off:
           | https://www.youtube.com/watch?v=nUxuCoqJzlA
           | 
           | Scrub that video timeline to see the information that would
           | be chopped off. For that, it's better to cover up only the
           | circle overlay with a blacked out disc.
        
             | spudlyo wrote:
             | > mpv doesn't run on iPad so it's better for my situation
             | to just burn the blackout into a new video.
             | 
             | I would love to stop using the YouTube client on iPadOS. Do
             | you just d/l the video with yt-dlp+ffmpeg and then post
             | process it based on your needs and then watch it from the
             | Files app from iCloud or whatever?
        
           | mikkupikku wrote:
           | With mpv you could draw over the video with libASS, but it
           | would be more straight forward to use ffmpeg filters from mpv
           | or otherwise.
        
         | slazaro wrote:
         | The quick way I'd solve that is to open any program window
         | (like calculator or whatever), mark it as being on top of other
         | windows, and resize it and place it on top of that area. It
         | seems quick and easy enough for the effort.
        
       | arc-in-space wrote:
       | Oh, I was not expecting an entire DSL for this. This looks really
       | useful.
        
       | mikkupikku wrote:
       | Looks very cool. I wonder if drawvg filters can be modified in
       | real time using zmq.
        
       | dotnot wrote:
       | Nice readme example, I would also like to see time of execution
       | for these tasks, I mean how much time for handling filters adds
       | comparing to non using it
        
       | dingdingdang wrote:
       | How far are we from having ffmpeg make automatic rotoscope
       | versions of our videos?!
        
       | sorenjan wrote:
       | The cropdetect example made me wonder if they're thinking about
       | including support for yolo or similar models. They're including
       | Whisper for text to speech already, I think yolo would enable
       | things like automatic face censoring and general frame content
       | aware editing. Or maybe Segment anything, and have more fine
       | grained masks available.
       | 
       | On the other hand, when I compared the binaries (ffmpeg, ffprobe,
       | ffplay) I downloaded the other day with the ones I had installed
       | since around September, they where almost 100 MB larger. I don't
       | remember the exact size of the old ones but the new ones are 640
       | MB, the old ones well under 600 MB. The only difference in
       | included libraries was Cairo and the JPEG-XS lib. So while I
       | think a bunch of new ML models would be really cool, maybe they
       | don't want to go down that route. But some kind of pluggable
       | system with accelerated ML models would be helpful I think.
        
       | jasonjmcghee wrote:
       | Didn't know this was a thing- thanks for posting.
       | 
       | Is there something similar that supports shaders? Like metal /
       | wgsl / glsl or something?
       | 
       | Sounds like a fun project...
        
       ___________________________________________________________________
       (page generated 2026-03-20 23:01 UTC)