Top
Best
New

Posted by josharsh 5 hours ago

Show HN: Ez FFmpeg – Video editing in plain English(npmjs.com)
I built a CLI tool that lets you do common video/audio operations without remembering ffmpeg syntax.

Instead of: ffmpeg -i video.mp4 -vf "fps=15,scale=480:-1:flags=lanczos" -loop 0 output.gif

You write: ff convert video.mp4 to gif

More examples: ff compress video.mp4 to 10mb ff trim video.mp4 from 0:30 to 1:00 ff extract audio from video.mp4 ff resize video.mp4 to 720p ff speed up video.mp4 by 2x ff reverse video.mp4

There are similar tools that use LLMs (wtffmpeg, llmpeg, ai-ffmpeg-cli), but they require API keys, cost money, and have latency.

Ez FFmpeg is different: - No AI – just regex pattern matching - Instant – no API calls - Free – no tokens - Offline – works without internet

It handles ~20 common operations that cover 90% of what developers actually do with ffmpeg. For edge cases, you still need ffmpeg directly.

Interactive mode (just type ff) shows media files in your current folder with typeahead search.

npm install -g ezff

181 points | 66 comments
qbow883 42 minutes ago|
Days since last ffmpeg CLI wrapper: 0

It's incredible what lengths people go to to avoid memorizing basic ffmpeg usage. It's really not that hard, and the (F.) manual explains the basic concepts fairly well.

Now, granted, ffmpeg's defaults (reencoding by default and only keeping one stream of each type unless otherwise specified) aren't great, which can create some footguns, but as long as you remember to pass `-c copy` by default you should be fine.

Also, hiding those footguns is likely to create more harm than it fixes. Case in point: "ff convert video.mkv to mp4" (an extremely common usecase) maps to `ffmpeg -i video.mkv -y video.mp4` here, which does a full reencode (losing quality and wasting time) for what can usually just be a simple remux.

Similarly, "ffmpeg extract audio from video.mp4" will unconditionally reencode the audio to mp3, again losing quality. The quality settings are also hardcoded and hidden from the user.

I can sympathize with ffmpeg syntax looking complicated at first glance, but the main reason for this is just that multimedia is really complicated and that some of this complexity is necessary in order to not make stupid mistakes that lose quality or waste CPU resources. I truly believe that these ffmpeg wrappers that try to make it seem overly simple (at least when it's this simple, i.e. not even exposing quality settings or differentiating between reencoding and remuxing) are more hurtful than helpful. Not only can they give worse results, but by hiding this complexity from users they also give users the wrong ideas about how multimedia works. "Abstractions" like this are exactly how beliefs like "resolution and quality are the same thing" come to be. I believe the way to go should be educating users about video formats and proper ffmpeg usage (e.g. with good cheat sheets), not by hiding complexity that really should not be hidden.

Forgeties79 28 minutes ago|
Some people just want to use an intuitive tool with better QoL, even if it leads to compromises, to do a job swiftly without going over documentation/learning a ton of new things. Not everything has to be an educational experience. ffmpeg exists in its original form like you prefer, but some folks want to use lossless cut. Nothing wrong with that IMO.

Personally I think it’s great that it’s such a universally useful tool that it has been deployed in so many different variations.

hnarn 23 minutes ago|||
> Some people just want to use a tool to do a job swiftly. Not everything has to be educational.

> some folks want to use lossless cut

In that case I would encourage you to ruminate on what the following in the post you're replying to means and what the implications are:

> "ff convert video.mkv to mp4" (an extremely common usecase) maps to `ffmpeg -i video.mkv -y video.mp4` here, which does a full reencode (losing quality and wasting time) for what can usually just be a simple remux

Depending on the size of the video, the time it would take you to "do the job swiftly" (i.e. not caring about how the tools you are using actually work) might be more than just reading the ffmpeg manual, or at the very least searching for some command examples.

qbow883 18 minutes ago|||
Yes, I am not opposed to ffmpeg wrappers in and of themselves. Some decent ffmpeg wrappers definitely exist. But I argue in my comment above that this specific tool does not have better QoL - again, since it reencodes unconditionally with quality settings that are usually not configurable.
dllu 4 hours ago||
When converting video to gif, I always use palettegen, e.g.

    ffmpeg -i input.mp4 -filter_complex "fps=15,scale=640:-2:flags=lanczos,split[a][b];[a]palettegen=reserve_transparent=off[p];[b][p]paletteuse=dither=sierra2_4a" -loop 0 output.gif
See also: this blog post from 10 years ago [1]

[1] https://blog.pkh.me/p/21-high-quality-gif-with-ffmpeg.html

dspillett 1 hour ago||
Does ffmpeg's gif processing support palette-per-frame yet? Last time I compared them (years ago, maybe not long after that blog post), this was a key benefit of gifski allowing it to get better results for the same filesize in many cases (not all, particularly small images, as the total size of the palette information can be significant).
CrossVR 4 hours ago|||
I've been thinking of integrating pngquant as an ffmpeg filter, it would make it possible to generate even better pallettes. That would get ffmpeg on par with gifski.
crazysim 1 hour ago|||
Gifski (https://gif.ski/) might be a good alternative to look to that's gif-pallete aware.
xattt 3 hours ago||
Those command flags just roll off the tongue like two old friends catching up!

/s

gcanyon 17 minutes ago||
I can only speak to my experience, but I spent a long time being puzzled by video editor user interfaces, until I ran into ScreenFlow about ten years ago. For whatever reason, the UI clicked, and I've used it ever since. It's a single purchase, not monthly, and relatively affordable. https://www.telestream.net/screenflow/overview.htm
HelloUsername 5 hours ago||
The one good usecase I've found for AI chatbots, is writing ffmpeg commands. You can just keep chatting with it until you have the command you need. Some of them I save as an executable .command, or in my .txt note.
corobo 3 hours ago||
LLMs are an amazing advance in natural language parsing.

The problem is someone decided that and the contents of Wikipedia was all something needs to be intelligent haha

madeofpalk 2 hours ago||
The confusion was thinking that language is the same thing as intelligence.
Marazan 1 hour ago||
This seems like a glib one liner but I do think it is profoundly insightful as to how some people approach thinking about LLMs.

It is almost like there is hardwiring in our brains that makes us instinctively correlate language generation with intelligence and people cannot separate the two.

It would be like if for the first calculators ever produced instead of responding with 8 to the input 4 + 4 = printed out "Great question! The answer to your question is 7.98" and that resulted in a slew of people proclaiming the arrival of AGI (or, more seriously, the ELIZA Effect is a thing).

Tempest1981 5 hours ago|||
One that older AI struggled with was the "bounce" effect: play from 0:00 to 0:03, then backwards from 0:03 to 0:00, then repeat 5 times.
geysersam 1 hour ago||
Just tried it and got this, is it correct?

> Write an ffmpeg command that implements the "bounce" effect: play from 0:00 to 0:03, then backwards from 0:03 to 0:00, then repeat 5 times.

  ffmpeg -i input.mp4 \
  -filter_complex "
  [0:v]trim=0:3,setpts=PTS-STARTPTS[f];
  [f]reverse[r];
  [f][r]concat=n=2:v=1:a=0[b];
  [b]loop=loop=4:size=150:start=0
  " \
  output.mp4
Terr_ 4 hours ago|||
As pessimistic about it as I am, I do think LLMs have a place in helping people turn their text description into formal directives. (Search terms, command-line, SQL, etc.)

... Provided that the user sees what's being made for them and can confirm it and (hopefully) learn the target "language."

Tutor, not a do-for-you assistant.

left-struck 4 hours ago|||
I agree apart from the learning part. The thing is unless you have some very specific needs where you need to use ffmpeg a lot, there’s just no need to learn this stuff. If I have to touch it once a year I have much better things to spend my time learning than ffmpeg command
rolfus 1 hour ago|||
Agreed. I have a bunch of little command-line apps that I use 0.3 to 3 times a year* and I'm never going to memorize the commands or syntax for those. I'll be happy to remember the names of these tools, so I can actually find them on my own computer.

* - Just a few days ago I used ImageMagick for the first time in at least three years. I downloaded it just to find that I already had it installed.

serial_dev 3 hours ago|||
There is no universe where I would like to spend brain power on learning ffmpeg commands by heart.
skydhash 47 minutes ago||
No one learns those. What people do is just learning the UX of the cli and the terminology (codec, opus, bitrate, sampling,…)
famahar 1 hour ago||||
Do most devs even look at the source code for packages they install? Or the compiled machine code? I think of this as just a higher level of abstraction. Confirm it works and not worry about the details of how it works
d-us-vb 39 minutes ago|||
For the kinds of things you’d need to reach for an LLM, there’s no way to trust that it actually generated what you actually asked for. You could ask it to write a bunch of tests, but you still need to read the tests.

It isn’t fair to say “since I don’t read the source of the libraries I install that are written by humans, I don’t need to read the output of an llm; it’s a higher level of abstraction” for two reasons:

1. Most Libraries worth using have already been proven by being used in actual projects. If you can see that a project has lots of bug fixes, you know it’s better than raw code. Most bugs don’t show up unless code gets put through its paces.

2. Actual humans have actual problems that they’re willing to solve to a high degree of fidelity. This is essentially saying that humans have both a massive context window and an even more massive ability to prioritize important things that are implicit. LLMs can’t prioritize like humans because they don’t have experiences.

skydhash 51 minutes ago|||
I don’t because I trust the process to get the artifacts. Why? Because it’s easy to replicate and verify. Just like how proof works in math.

You can’t verify LLM’s output. And thus, any form of trust is faith, not rational logic.

xattt 3 hours ago||||
It you stretch it little further, those formal directives also include language and vocabulary of a particular domain (legalese, etc…).
eviks 4 hours ago|||
The "provided" isn't provided, of course, especially the learning part, that's not what you'd turn to AI for vs more reliable tutoring alternatives
beepbooptheory 4 hours ago||
But doesnt something like this interface kind of show the inefficiency of this? Like we can all agree ffmpeg is somewhat esoteric and LLMs are probably really great at it, but at the end of the day if you can get 90% of what you need with just some good porcelain, why waste the energy spinning up the GPU?
pixelpoet 3 hours ago|||
Requiring the installation of a massive kraken like node.js and npm to run a commandline executable hardly screams efficiency...
RadiozRadioz 1 hour ago||
That's a deficiency with this particular implementation, not an inherent disadvantage to the method
chpatrick 3 hours ago||||
Because FFmpeg is a swiss army knife with a million blades and I don't think any easy interface is really going to do the job well. It's a great LLM use case.
skydhash 44 minutes ago||
But you only need to find the correct tool once and mark it in some way. Aka write a wrapper script, jot down some notes. You are acting like you’re forced to use the cli each time.
geysersam 1 hour ago||||
Because getting 90% might not be good enough, and the effort you need to expend to reach 97% costs much more than the energy the GPU uses.
imiric 4 hours ago|||
Because the porcelain is purpose built for a specific use case. If you need something outside of what its author intended, you'll need to get your hands dirty.

And, realistically, compute and power is cheap for getting help with one-off CLI commands.

vithalreddy 4 hours ago||
Can't access the githup repo https://github.com/josharsh/ezff
az09mugen 2 hours ago||
Same here, I get a 404 from github. The said link is at the bottom of the submitted npmjs page.
ramigb 1 hour ago||
yeah me too but npm has the code tab https://www.npmjs.com/package/ezff?activeTab=code
ramigb 1 hour ago||
That's beautiful! I see a .claude folder in your code, I am curious if you've "vibecoded" the whole project or just had claude there for some tasks! not that it matters or takes away from your work but just pure curiosity as someone who enjoys betting on the LLM output XD
alexellisuk 54 minutes ago||
This looks handy.. along with the odd gist of "convert mkv to mp4" that I have to use every other week.

Quite telling that these tools need to exist to make ffmpeg actually usable by humans (including very experienced developers).

teitoklien 39 minutes ago||
i figure out the niche ffmpeg commands various chain filters, etc then expose them from my python cli tool with words similar to what this gentleman above has done.

If one has fewer such commands its as simple as just bash aliases and just adding it to ~/.bashrc

alias convertmkvtomp4='ffmpeg command'

then just run it anytime with just that alias phrase i use ffmpeg a lot so i have my own dedicated cli snippet tool for me, to quickly build out complex pipeline in easier language

the best part is i have --dry-run then exposes the flow + explicit commands being used at each step, if i need details on whats happening and verbose output at each step

sallveburrpi 45 minutes ago||
I have a text file with some common commands, so no tools needed.

But yea ffmpeg is awesome software, one of the great oss projects imo. working with video is hellish and it makes it possible.

ramon156 1 hour ago||
> it handles 20 common patterns ... that cover 90%

Could you elaborate on this? I see a lot of AI-use and I'm wondering if this is claude speaking or you

eviks 4 hours ago||
That's the problem ideally solved by typed data, i.e., some UI where instead of trying to memorize whether it's thumb/s/nails you can read the closed list of alternatives, read contextual help and pick one
my_brain_saying 4 hours ago|
This is why we have fish tab completions. Does exactly that; list of possible commands with contextual help. Fish rules.
eviks 3 hours ago||
Yeah, no, that's a pale imitation that only addresses the one specific example given. But, like, how would you even know what target formats are supported? Break the flow and look it up or simply read the drop-down list? The free type-any-text interface with poor helpers is the worst in accessibility

Which format is the default if no argument is given?

Or more complicated contextual knowledge - if you cut 1sec of a video file, does fish autocomplete to tell you whether the video is reencoded or cut (otherwise) losslessly

Also, what does fish complete to on Windows?

skydhash 37 minutes ago|||
Which flow is being broken here? Especially when the information is easily accessible with `man`.
eviks 30 minutes ago||
the flow that doesn't require you to open a different tab or cancel a command to `man` your way through dozens of poorly searchable pages of documentation, but allows you to continue translating what you want in your mind into the interface command with delay potentially subsecond interrupts
skydhash 15 minutes ago||
Is there kind of rewards for speed running typing ffmpeg flags? Like an advent of ffmpeg?

I know what I want to do, I don't know how it's being done, but there's a wealth of information that is very accessible. So I just read it.

It's very easy to type `apropos ffmpeg`. And even if you typed `man ffmpeg`, if you go to the end, you will find related manuals name for more information. And you can always use the pager (`less` in most case) facility for quick search.

I believe that a lot of frustration comes from people unwilling to learn the conceptual basis of the tools they are using.

petterroea 4 hours ago|
Somehow it seems ffmpeg has become the "Can it run crysis" of UX design
More comments...