« BackFFmpeg by Exampleffmpegbyexample.comSubmitted by piyushsthr 19 hours ago
  • hbn 8 hours ago

    I've enjoyed using ffmpeg 1000% more since I was able to stop doing manually the tedious task of Googling for Stack Overflow answers and cobbling them into a command and got Chat GPT to write me commands instead.

    • simonw 5 hours ago

      I use ffmpeg multiple times a week thanks to LLMs. It's my top use-case for my "llm cmd" tool:

        uv tool install llm
        llm install llm-cmd
      
        llm cmd use ffmpeg to extract audio from myfile.mov and save that as mp3
      
      https://github.com/simonw/llm-cmd
      • resonious 5 hours ago

        I tried this (though with a different tool called aichat) for extremely simple stuff like just "convert this mov to mp4" and it generated overly complex commands that failed due to missing libraries. When I removed the "crap" from the commands, they worked.

        So much like code assistance, they still need a fair amount of baby sitting. A good boost for experienced operators but might suck for beginners.

        • sdesol 3 hours ago

          > "convert this mov to mp4"

          Did any of the commands look like the ones in the left window:

          https://beta.gitsense.com/?chats=12850fe4-ffb1-4618-9215-c13...

          The left window contains a summary of all the LLMs asked, including all commands. The right window contains the individual LLM responses.

          I asked about gotchas with missing libraries as well, and Sonnet 3.5 said there were. Were these the same libraries that were missing for you?

          • resonious 3 hours ago

            Looking at this, I am pretty sure I also received a "libx264" clause. Removing it made the command work for me.

            • sdesol 2 hours ago

              I don't disagree that we need to be cautious with LLMs, but I've personally stopped asking GPT-4/GPT-4 mini for technical answers. Sonnet 3.5 and DeepSeek V3 (which is much cheaper but still not as good as Sonnet) are your best bet for technical questions.

              Where I find GPT to perform better than Sonnet is with text processing. GPT seems to better understand what I want when it comes to processing documents.

              I'm convinced that no LLM provider has created or will create a moat, and that we will always need to shop around for an answer.

              • wegfawefgawefg 10 minutes ago

                everyone stopped using 4/4mini because theyre old.

                4o replaced 4 back in April 2024. 01/01mini replaced 4o in Fall 2024.

                stop using 4. use 01mini always. its cheaper, faster, and better.

                o1/o1mini will be replaced by o3/o3mini in a couple months.

              • jack_pp an hour ago

                libx264 is the best encoder for h264 ffmpeg has to offer so it's pretty important you bundle it in your ffmpeg install. Those commands are perfectly standard, I've been using something like that for 10+ years

            • Over2Chars 2 hours ago

              My feelings exactly, but I think that's OK!

              It's another tool and one that might actually improve with time. I don't see GNU's man pages getting any better spontaneously.

              Whoa, what if they started to use AI to auto-generate man pages...

              • Philpax 4 hours ago

                Hate to be that guy, but which LLM was doing the generation? GPT-4 Turbo / Claude 3.x have not really let me down in generating ffmpeg commands - especially for basic requests - with most of their failures resulting from domain-specific vagaries that an expert would need to weigh in on m

                • resonious 3 hours ago

                  GPT-4

                  • Philpax 2 hours ago

                    Fair enough. If you remember what you were testing with, I'd love to try it again to see if things are better now.

                    • Over2Chars 2 hours ago

                      You have a fair point. Some LLMs are better at some tasks, and prompts can make a difference no doubt.

                      Perhaps at some point there will be a triage LLM to slurp up the problem and then decide which secondary LLM is most optimal for that query, and some tertiary LLMs that execute and evaluate it in a virtual machine, etc.

                      Maybe someday

                      • NavinF an hour ago

                        Oh I talked to some guys who started a company that does that. This was at an AI meetup in SF last year. They were mainly focused on making $/token cheaper by directing easy/dumb queries to smaller dumber models, but it also increases output quality because some models are just better at certain things. I'm sure all the big companies already have implementations of this by now even if they don't use it everywhere

                        • Over2Chars 34 minutes ago

                          I was suggesting optimizing for answer quality, but optimizing for cost might be useful too I suppose for "business innovation" purposes.

                  • th0ma5 3 hours ago

                    Hate to be that guy, but which model works without fail for any task that ffmpeg can do?

                    • iameli 3 hours ago

                      "Writing working commands first try for every single ffmpeg feature that exists" is the highest bar I've ever heard of, I love it. I'm gonna start listing it as a requirement on job postings. Like an ffmpeg speedrun.

                      • Philpax 3 hours ago

                        I don't think there's a single human on or outside of this planet that can meet that requirement, but Claude has been pretty good to me. It's certainly a much better starting point than pouring over docs and SO posts.

                        • bloqs 3 hours ago

                          This doesnt exist in reality so in one sense, you could challenge the relevance

                    • zahlman 5 hours ago

                      >This will then be displayed in your terminal ready for you to edit it, or hit <enter> to execute the prompt. If the command doesnt't look right, hit Ctrl+C to cancel.

                      I appreciate the UI choice here. I have yet to do anything with AI (consciously and deliberately, anyway) but this sort of thing is exactly what I imagine as a proper use case.

                      • hnuser123456 4 hours ago

                        Just like all other code. There will be user-respecting open source code and tools, and there's user-disrespecting profitable closed code that makes too many decisions for you.

                      • dekhn 5 hours ago

                        "The future is already here. It's just not very well distributed"

                        (honestly, the work you share is very inspiring)

                        • Waterluvian 3 hours ago

                          I think I’m finally sold on actually attempting to add some LLM to my toolbelt.

                          As a helper and not a replacement, this sounds grand. Like the most epic autocomplete. Because I hate how much time I waste trying to figure out the command line incantation when I already know precisely what I want to do. It’s the weakest part of the command line experience.

                          • Over2Chars 2 hours ago

                            But possibly the most rewarding. The struggle is its own reward that pays off later many times over.

                            • Waterluvian 16 minutes ago

                              Not for me. It’s a tool I don’t care to use any more than I have to. I’m much more interested in what I’m using the tool to accomplish.

                          • th0ma5 3 hours ago

                            You should figure out what went wrong for the other commenter and fix your tool.

                          • levocardia 7 hours ago

                            For the longest time I had ffmpeg in the same bucket as regex: "God I really need to learn this but I'm going to hate it so much." Then ChatGPT came along and solved both problems!

                            • zxvkhkxvdvbdxz 4 hours ago

                              Interesting. Being able to use regexps for text processing through my career has probably saved me a few thousand hours of programming one-off solutions so far. It is one of those skills that really pays off to learn proper.

                              And speaking of ffmpeg, or tooling in general, I tend to make notes. After a while you end up with a pretty decent curated reference.

                              • codetrotter 3 hours ago

                                I use regexes a lot. The main thing that always trips me up is dealing with escaping, because different tools I use – vim, sed, rg, and so on – sometimes have different meanings for when to escape or not.

                                In one tool you’ll use + to match one or more times, and \+ to mean literal plus sign.

                                In another tool you’ll use \+ to match one or more time, and + to mean literal plus sign.

                                In one tool you’ll use ( and ) to create a match group, and \( and \) to mean literal open and close parentheses.

                                In another tool you’ll use \( and \) to create a match group, and ( and ) to mean literal open and close parentheses.

                                This is basically the only problem I have when writing regexes, for the kinds of regexes I write.

                                Also, one thing that’s not a problem per se but something that leads me to write my regexes with more characters than strictly necessary is that I rarely use shorthand for groups of characters. For example the tool might have a shorthand for digit but I always write [0-9] when I need to match a digit. Also probably because the shorthand might or might not be different for different tools.

                                Regexes are also known to be “write once read never”, in that writing a regex is relatively easy, but revisiting a semi-complicated regex you or someone else wrote in the past takes a little bit of extra effort to figure out what it’s matching and what edits one should make to it. In this case, tools like https://regex101.com/ or https://www.debuggex.com/ help a lot.

                                • mystified5016 2 hours ago

                                  No one doubts the power or utility of regexes or ffmpeg, but they are both complicated beasts that really take a lot of skill.

                                  They're both tools where if they're part of your daily workflow you'll get immense value out of learning them thoroughly. If instead you need a regex once or twice a week, the benefit is not greater than the cost of learning to do it myself. I have a hundred other equally complicated things to learn and remember, half the job of the computer is to know things I can't put in my brain. If it can do the regex for me, I suddenly get 70% of the value at no cost.

                                  Regex is not a tool I need often enough to justify the hours and brain space. But it is still an indespensible tool. So when I need a regex, I either ask a human wizard I know, or now I ask my computer directly.

                                • earnestinger 6 hours ago

                                  Not sure about ffmpeg, but you should definitely try memorising regexp. Casual Search&replace that becomes possible is worth it.

                                  • sergiotapia 5 hours ago

                                    in 15 years it never sticks and by the time i need it again i've forgotten it! :D

                                    • kevin_thibedeau 5 hours ago

                                      Don't learn the Perl influenced extensions. You just need POSIX EREs (and BREs for some older utilities) which are simple enough to keep in the head.

                                      • ziml77 3 hours ago

                                        And with the POSIX EREs, everything except the syntax for character classes will carry over to other common Regex dialects.

                                • shlomo_z 2 hours ago

                                  ... Then ChatGPT came along and I had 3 problems! https://regex.info/blog/2006-09-15/247

                                  • teaearlgraycold 6 hours ago

                                    Gotta be honest, years of configuring automod on Reddit have honed me into a regex God.

                                    • hackingonempty 7 hours ago

                                      CSS has entered the ChatGPT.

                                      • kccqzy 5 hours ago

                                        My rule for using LLMs is that anything that's one off is okay. Anything that's more permanent and committed to a repo needs a human review. I strongly suggest you have an understanding of the basics (at least the box model) so that you are competent at reviewing CSS code before using LLM for that.

                                        • permo-w 6 hours ago

                                          I've been looking for a good guide on prompting LLMs for CSS.

                                          does anyone know of any?

                                      • pdyc 39 minutes ago

                                        I ended up creating my own tool to generate ffmpeg commands https://newbeelearn.com/tools/videoeditor/

                                        • Over2Chars 2 hours ago

                                          I think you're onto something. I've had hit or miss experiences with code from LLMs but it definitely makes the searching part different.

                                          I had a problem I'd been thinking about for some time and I thought "Ill have some LLM give me an answer" and it did - it was wrong and didn't work but it got me to thinking about the problem in a slightly different way and my quacks after that got me an exact solution to this problem.

                                          So I'm willing to give the AI more than partial credit.

                                          • juancroldan 7 hours ago

                                            Same here, it's one of these things where AI has taken over completely and I'm just a broker that copy-pastes error traces.

                                            • magarnicle 7 hours ago

                                              My experience got even better once I learned how complex filters worked.

                                              • dylan604 6 hours ago

                                                learning how to use splits to do multiple things all in one command is a god send. the savings of only needed to read the source and convert to baseband video once is a great savings.

                                                i started with avisynth, and it took time for my brain to switch to ffmpeg. i don't know how i could function without ffmpeg at this point

                                              • urda 2 hours ago

                                                For me it was using a container of it, instead of having to install all the things FFmpeg needs on a machine.

                                              • jazzyjackson 8 hours ago

                                                This reminds me I need to publish my write up on how I've been converting digitized home video tapes into clips using scene detection, but in case anyone is googling for it, here's a gist I landed on that does a good job of it [0] but sometimes it's fooled by e.g. camera flashes or camera shake so I need to give it a start and end file and have ffmpeg concatenate them back together [1]

                                                Weird thing is I got better performance without "-c:v h264_videotoolbox" on latest Mac update, maybe some performance regression in Sequoia? I don't know. The equivalent flag for my windows machine with Nvidia GPU is "-c:v h264_nvenc" . I wonder why ffmpeg doesn't just auto detect this? I get about 8x performance boost from this. Probably the one time I actually earned my salary at work was when we were about to pay out the nose for more cloud servers with GPU to process video when I noticed the version of ffmpeg that came installed on the machines was compiled without GPU acceleration !

                                                [0] https://gist.githubusercontent.com/nielsbom/c86c504fa5fd61ae...

                                                [1] https://gist.githubusercontent.com/jazzyjackson/bf9282df0a40...

                                                • jack_pp an hour ago

                                                  > Probably the one time I actually earned my salary at work was when we were about to pay out the nose for more cloud servers with GPU to process video when I noticed the version of ffmpeg that came installed on the machines was compiled without GPU acceleration !

                                                  Issue with cloud CPU's is that they don't come with any of the consumer grade CPU built-in hardware video encoders so you'll have to go with the GPU machines that cost so much more. To be honest I haven't tried using HW accel in the cloud to have a proper price comparison, are you saying you did it and it was worth it?

                                                  • radicality 4 minutes ago

                                                    Are the hardware encoders even good? I thought that unless you need something realtime, it's always better to spend the cpu cycles on a better encode with th software encoder. Or have things changed ?

                                                  • dekhn 5 hours ago

                                                    I used ffmpeg for empty scene detection- I have a camera pointed at the flight path for SFO, and stripped out all the frames that didn't have motion in them. You end up with a continuous movie of planes passing through, with none of the boring bits.

                                                    • hnuser123456 4 hours ago

                                                      Then can you merge all the clips starting when motion starts and see hundreds of planes fly across at once?

                                                      • dekhn 4 hours ago

                                                        Interesting. Yes, I assume that's possible although I'm not sure how you handle the background- I guess you find an empty frame, and subtract that from every image with a plane.

                                                        One of the advantages of working with image data is that movies are really just 3d data and as long as all the movies you work with are the same size, if you have enough ram, or use dask, you could basically do this in a couple lines of numpy.

                                                        • hnuser123456 3 hours ago

                                                          You could do an add operation if the background is dark enough, or yeah, take a local sample of the background to subtract from each clip, and choose a specific background...

                                                    • rahimnathwani 7 hours ago

                                                        -c:v h264_nvenc
                                                      
                                                      This is useful for batch encoding, when you're encoding a lot of different videos at once, because you can get better encoding throughput.

                                                      But in my limited experiments a while back, I found the output quality to be slightly worse than with libx264. I don't know if there's a way around it, but I'm not the only one who had that experience.

                                                      • ziml77 3 hours ago

                                                        IIRC they have improved the hardware encoder over the generations of cards, but yes NVENC has worse quality than libx264. NVENC is really meant for running the compression in real-time with minimal performance impact to the system. Basically for recording/streaming games.

                                                        • icelancer 6 hours ago

                                                          So counterintuitive that nvenc confers worse quality than QSV/x264 variants, but it is both in theory and in my testing as well.

                                                          But for multiple streams or speed requirements, nvenc is the only way to fly.

                                                          • xnx 7 hours ago

                                                            Co-signing. Encode time was faster with nvenc, but quality was noticeably worse even to my untrained eye.

                                                            • jazzyjackson 7 hours ago

                                                              Fascinating, it didn't occur to me quality could take a hit, I thought the flag merely meant "perform h264 encoding over here"

                                                              Edit: relevant docs from ffmpeg, they back up your perception, and now I'm left to wonder how much I want to learn about profiles in order to cut up these videos. I suppose I'll run an overnight job to reencode them from Avi to h264 at high quality, and make sure the scene detect script is only doing copys, not reencoding, since that's the part I'm doing interactively, there's no real reason I should be sitting at the computer while its transcoding.

                                                              Hardware encoders typically generate output of significantly lower quality than good software encoders like x264, but are generally faster and do not use much CPU resource. (That is, they require a higher bitrate to make output with the same perceptual quality, or they make output with a lower perceptual quality at the same bitrate.)

                                                              [0] https://trac.ffmpeg.org/wiki/HWAccelIntro

                                                              • throwaway4PP 5 hours ago

                                                                It’s crude, but you can overcome the degraded quality imparted by gpu accelerated encoding by specifying a higher video bitrate.

                                                                Find a complex short scene in your cpu encoded video, extract it, ffprobe it to get average video bitrate, and take the same clip in raw and try gpu accelerated encoding at +20% bitrate. From there, iterate.

                                                                For a friend’s use-case that I helped with, +30% video bitrate bump overcame the degraded vquality.

                                                                Edit: strangely enough, if memory serves, after the correcting +30% was applied the actual ffprobe bitrates between the videos were very similar, maybe a 10% or less difference. Someone smarter than me can work that logic out.

                                                                • norgie 6 hours ago

                                                                  Cutting videos with copy can result in some weird playback issues if the cuts aren't on keyframes.

                                                                  For manually cutting up videos, I use LosslessCut, which I think uses ffmpeg under the hood and is really helpful for finding and cutting on keyframes.

                                                                  • pertymcpert 5 hours ago

                                                                    Yes. The reason is that there's many ways to encode a video, you can choose to spend a lot of compute in order to get the best quality, or the best size efficiency. Fixed function hardware encoders by nature have much less freedom in how they encode, and additionally are expected to be faster, or even real time.

                                                            • dekhn 5 hours ago

                                                              I've gotten pretty good at various bits of ffmpeg over time. Its CLI has a certain logic to it... it's order dependent (not all unix CLIs are).

                                                              Lately, I've been playing around with more esoteric functionality. For example, storing raw video straight off a video camera on a fairly slow machine. I built a microscope and it reads frames off the camera at 120FPS in raw video format (YUYV 1280x720) which is voluminous if you save it directly to disk (gigs per minute). Disks are cheap but that seemed wasteful, so I was curious about various close-to-lossless techniques to store the exact images, but compressed quickly. I've noticed that RGB24 conversion in ffmpeg is extremely slow, so instead after playing around with the command line I ended up with:

                                                                ffmpeg -f rawvideo -pix_fmt yuyv422 -s 1280x720 -i test.raw  -vcodec libx264 -pix_fmt yuv420p  movie.mp4 -crf 13 -y
                                                              
                                                              This reads in raw video- because raw video doesn't have a container, it lacks metadata like "pixel format" and "image size", so I have to provide those. It's order dependent- everything before "-i test.raw" is for decoding the input, and everythign after is for writing the output. I do one tiny pixel format conversion (that ffmpeg can do really fast) and then write the data out in a very, very close to lossless format with a container (I've found .mkv to be the best container in most cases).

                                                              Because I hate command lines, I ended up using ffmpeg-python which composes the command line from this:

                                                                self.process = (
                                                                          ffmpeg.
                                                                          input(
                                                                              "pipe:",
                                                                              format="rawvideo",
                                                                              pix_fmt="yuyv422",
                                                                              s="{}x{}".format(1280, 720),
                                                                              threads=8
                                                                          )
                                                                          .output(
                                                                              fname, pix_fmt="yuv422p", vcodec="libx264", crf=13 
                                                                          )  
                                                                          .overwrite_output()
                                                                          .global_args("-threads", "8")
                                                                          .run_async(pipe_stdin=True)
                                                                          )
                                                              
                                                              and then I literally write() my frames into the stdin of that process. I had to limit the number of threads because the machine has 12 cores and uses at least 2 at all times to run the microscope.

                                                              I'm still looking for better/faster lossless YUV encoding.

                                                              • zahlman 4 hours ago

                                                                >Its CLI has a certain logic to it... it's order dependent (not all unix CLIs are).

                                                                Which is appropriate. A Unix pipeline is dependent on the order of the components, and complex FFMpeg invocations entail doing something analogous.

                                                                >I ended up using ffmpeg-python which composes the command line from this

                                                                A lot of people like this aesthetic, but doing "fluent" interfaces like this is often considered un-Pythonic. (My understanding is that ffmpeg-python is designed to mirror the command-line order closely.) The preference (reinforced by the design of the standard library and built-in types) is to have strong https://en.wikipedia.org/wiki/Command%E2%80%93query_separati... . By this principle, it would look something more like

                                                                  ffmpeg(global_args=..., overwrite_output=True).process_async(piped_input(...), output(...))
                                                                
                                                                where using a separate construction process for the input produces a different runtime type, which also cues the processing code that it needs to read from stdin.
                                                                • dekhn 4 hours ago

                                                                  To be honest what I really wanted is more like a programming API or config file than attempting to express complex pipelines and filters in a single command line.

                                                                  As for what's unpythonic: don't care. My applications has code horrors that even Senior Fellows cannot unsee.

                                                                  • zahlman an hour ago

                                                                    I get that. My critique is for the library authors, not you.

                                                                • jcalvinowens 5 hours ago

                                                                  > I'm still looking for better/faster lossless YUV encoding.

                                                                  Look no further: https://trac.ffmpeg.org/wiki/Encode/FFV1

                                                                  • dekhn an hour ago

                                                                    I spent some time with this on my data set, and in my hands I wasn't able to produce results that were convincingly better than libx264, but with slower encodes and larger output files. It's really hard to beat libx264.

                                                                • pdyc 32 minutes ago

                                                                  The great ffmpeg!, Even though you can generate commands using llm its still tedious to adjust things visually on cli so I ended up creating my own tool to generate ffmpeg commands.

                                                                  https://newbeelearn.com/tools/videoeditor/

                                                                  • nickdothutton 7 hours ago

                                                                    FFmpeg is one of those tools I need to use so infrequently that he exact syntax never seems to stick. I've resorted to using an LLM to give me the command line I need. The only other tool that I ever had trouble with was 1990s-era MegaCLI from LSI Logic, also something I barely used from one year to the next (but one where you really need to get it right under pressure).

                                                                    • pseudosavant 7 hours ago

                                                                      I've been using FFMPEG for 15+ years, and still can't remember almost any commands. LLMs have been amazing for using FFMPEG though. ChatGPT and Claude do wonders with "give me an ffmpeg command that will remux a video into mkv, include subtitle.srt in the file, and I only want it between 0:00:05 and 0:01:00." It produced this in case you were wondering: `ffmpeg -i input.mp4 -i subtitle.srt -ss 00:00:05 -to 00:01:00 -map 0 -map 1 -c copy -c:s mov_text output.mkv`

                                                                      I wonder how small of an LLM you could develop if you only wanted to target creating ffmpeg commands. Perhaps it could be small enough to be hosted on a static webpage where it is run locally?

                                                                    • escapecharacter 7 hours ago

                                                                      I've just maintained my own note doc, going on 15 years now, of my most commonly used syntax. When that fails, I grep my bash history.

                                                                      • daveslash 7 hours ago

                                                                        Same. The only thing that sticks is converting from format X to .mp4. Everything else I need to look up every single time.

                                                                        Relevant XKCD https://xkcd.com/1168/

                                                                        • dmd 6 hours ago

                                                                          Yeah I commented the other day, tongue firmly in cheek, that it's probably worth burning down all the rainforests just so LLMs can tell me the right ffmpeg flags to do what I want.

                                                                        • greenavocado 5 hours ago

                                                                          Don't forget that Gstreamer exists and its command line and documentation make a little bit more sense than ffmpeg because GStreamer is pipeline based and the composition is a little bit more sane. I stopped using ffmpeg entirely and only use GStreamer for intense video work.

                                                                          • jack_pp 39 minutes ago

                                                                            Gstreamer can give you more control and has friendlier API's if you're gonna make a pipeline programatically but for one off stuff ffmpeg seems much friendlier to me. For example it has sane x264 defaults while with gst-launch you have to really know what you're doing to get quality x264 encoding

                                                                            • legends2k 5 hours ago

                                                                              I thought FFmpeg is pipeline based too; graph of filters. Am I missing something? You can set up a complex graph of source, sink and transform filters.

                                                                              • greenavocado 5 hours ago

                                                                                You're right, but gstreamer is a little bit more sane for many use cases. Maybe ffmpeg is more advanced; I am not sure. I find the pieces fit together better with gstreamer.

                                                                                • lehi 5 hours ago

                                                                                  FFmpeg's filter DSL is so good that I get annoyed if I ever have to fall back to command line switches.

                                                                                • remram 3 hours ago

                                                                                  GStreamer feels like abandonware though, they also got big vulnerabilities recently, and their docs are very defunct.

                                                                                • ehsankia 21 minutes ago

                                                                                  No one seems to be talking about the website itself.

                                                                                  While as a concept, I absolutely love "X by Example" websites, this one seems to make some strange decisions. First, the top highlighted example is just an overly complicated `cat`. I understand that it's meant to show the versatility of the tool, but it's basically useless.

                                                                                  Then below, there's 3 pages of commands, 10 per page. No ordering whatsoever in terms of usefulness. There looks like there's an upvote but it's actually just a bullet decoration.

                                                                                  There's also a big "try online" button for a feature that's not actually implemented.

                                                                                  All in all, this is a pretty disappointing website that I don't think anyone in this thread will actually use, even though everyone seems to be "praising" it.

                                                                                  • merksoftworks 7 hours ago

                                                                                    ffmpeg has always felt like a gui application crammed into tui format. I've had the displeasure of using the C api a few times, while it's straight forward in many respects, it makes invalid states extremely easy to represent. I would love a realtime AV1 encoding framework that "just works".

                                                                                    • mastax 4 hours ago

                                                                                      I can vouch for GStreamer as an API. I was using the Rust bindings so not super familiar with the C API but it looks good. GObject makes some things verbose but once you understand it you can interact with every object in the API consistently. There is a ton of necessary complexity (video is hard) but it’s really well designed and pretty well implemented and documented.

                                                                                      If you have a pretty normal use case the Bins (decodebin, transcodebin, playbin) make that pretty easy. If you have a more complex use case the flexibility of the design makes it possible.

                                                                                      • garaetjjte 3 hours ago

                                                                                        ffmpeg API is somewhat clunky but it works fine. I dread working with gstreamer, sea of leaky abstractions, inexplicable workarounds and mysterious bugs.

                                                                                    • fastily 7 hours ago

                                                                                      Nice! This reminds me of my own ffmpeg cheatsheet; I would imagine that everyone who uses ffmpeg frequently has a similar set of notes

                                                                                      https://github.com/fastily/cheatsheet/blob/master/ffmpeg.md

                                                                                    • Over2Chars 2 hours ago

                                                                                      Ya know, it's websites like this that make me want to see a "best of HNN" list, so it can be easily found when I'm using ffmpeg and saying "geez, there was some cool ffmpeg site, but where the heck is it?...."

                                                                                      Can we have a best of HNN and put it on there, or vote on it, or whatever?

                                                                                    • alpb 6 hours ago

                                                                                      I love "X by Example" sites! But if you don't work with a tool like ffmpeg imagemagick day in and out, there's no way you'll remember their unintuitive syntax or will want to spend the time to get your one-time job done. I'd still probably not use this site to scan a dozen of examples and try to put together the pieces of the puzzle; instead, I'd probably just use an LLM who already scanned the entire web corpus and can probably get me to a solution faster, right? At that point, I wonder what folks get out of this site?

                                                                                      • AdieuToLogic 2 hours ago

                                                                                        Here is the GitHub repo for a ffmpeg book which may be a nice supplement to this site:

                                                                                        https://github.com/jdriselvato/FFmpeg-For-Beginners-Ebook

                                                                                        • karpathy 4 hours ago

                                                                                          I think at this point docs should start to be written not for humans but for LLMs, i.e. package all of it up with the --help into one giant txt file for easy attachment to an LLM when asking the question you'd like. Imo it's a relatively good fit to the current capability.

                                                                                          • cb321 7 hours ago

                                                                                            While it does have a rather unusual/bespoke command syntax (strongly motivating TFA), lately ffmpeg works my webcam more reliably than Google chrome. Too bad my other-side conversations don't have things set up to negotiate a session with it!

                                                                                            • patchtopic 6 hours ago

                                                                                              also worthwhile consulting this resource: https://www.youtube.com/watch?v=9kaIXkImCAM

                                                                                              • skykooler 2 hours ago

                                                                                                Wow, I wish I had seen this literally yesterday!

                                                                                                • somat 4 hours ago

                                                                                                  I was pretty happy because I was able to actually do something in ffmpeg recently. It is this amazingly powerfully tool, but every time I try to use it I get scared off by the inscrutable syntax. But this time as the mental miasma that usually kills my ffmpeg attempts was setting in I noticed something in the filter docs, a single throw away line about including files and the formatting of filters

                                                                                                  Anyway long story short, instead of the usual terrifying inline ffmpeg filter tangle. the filter can be structured however you want and you can include it from a dedicated file. It sounds petty, but I really think it was the thing that finally let me "crack" ffmpeg

                                                                                                  The secret sauce is the "/", "-/filter_complex file_name" will include the file as the filter.

                                                                                                  As I am pretty happy with it I am going to inflect it on everyone here.

                                                                                                  In motion_detect.filter

                                                                                                      [0:v]
                                                                                                      split
                                                                                                              [motion]
                                                                                                              [original];
                                                                                                      [motion]
                                                                                                      scale=
                                                                                                              w=iw/4:
                                                                                                              h=-1,
                                                                                                      format=
                                                                                                              gbrp,
                                                                                                      tmix=
                                                                                                              frames=2
                                                                                                              [camera];
                                                                                                      [1:v]
                                                                                                      [camera]
                                                                                                      blend=
                                                                                                              all_mode=darken,
                                                                                                      tblend=
                                                                                                              all_mode=difference,
                                                                                                      boxblur=
                                                                                                              lr=20,
                                                                                                      maskfun=
                                                                                                              low=3:
                                                                                                              high=3,
                                                                                                      negate,
                                                                                                      blackframe=
                                                                                                              amount=1,
                                                                                                      nullsink;
                                                                                                   
                                                                                                      [original]
                                                                                                      null
                                                                                                  
                                                                                                  
                                                                                                  
                                                                                                  And then some python glue logic around the command

                                                                                                      ffmpeg -nostats -an -i ip_camera -i zone_mask.png -/filter_complex motion_display.filter -f mpegts udp://127.0.0.1:8888
                                                                                                  
                                                                                                  And there you have it, motion detection while staying in a single ffmpeg process, the glue logic watches stdout for the blackframe messages and saves the video.

                                                                                                  explanation:

                                                                                                  "[]" are named inputs and outputs

                                                                                                  "," are pipes

                                                                                                  ";" ends a pipeline

                                                                                                  take input 0 split it into two streams "motion" and "original". the motion stream gets scaled down, converted to gbrp(later blends were not working on yuv data) then temporally mixed with the previous two frames(remove high frequency motion), and sent to stream "camera". Take the zone mask image provided as input 1 and the "camera" stream, mask the camera stream, find the difference with the previous frame to bring out motion, blur to expand the motion pixels and then mask to black/white, invert the image for correct blackframe analyses which will print messages on stdout when too many motion pixels are present. The "original" stream get sent to the output for capture.

                                                                                                  One odd thing is the mpegts, I tried a few more modern formats but none "stream" as well as mpegts. I will have to investigate further.

                                                                                                  I could, and probably should have, used opencv to do the same. But I wanted to see if ffmpeg could do it.

                                                                                                  • ge96 8 hours ago

                                                                                                    ffmpeg is so goated, I used it to merge video/audio from a mic on a camera I made ha

                                                                                                    there was one time I didn't use pyaudio correctly so I was using this process where ffmpeg can stitch multiple audio files together into one passed in as an array cli argument, crazy

                                                                                                    • t1234s 3 hours ago

                                                                                                      anyone know how to use ffmpeg to get a video to cross-fade from the end to the start so it makes a nice loop? I cant seem to get the right response from ChatGPT.

                                                                                                      • asicsp 3 hours ago
                                                                                                        • bugglebeetle 7 hours ago

                                                                                                          Somebody please pay people to create sites like this so LLMs can train on them and I never have to spend time thinking about arcane FFMPEG commands ever again. I remember losing whole days in the before times trying to figure out how to make FFMPEG do some highly specific set of things.

                                                                                                          • dheera 8 hours ago

                                                                                                            I just use LLMs to help me with ffmpeg (and many other similarly complex tools) commands: https://github.com/dheera/scripts/blob/master/helpme

                                                                                                                $ helpme ffmpeg capture video from /dev/video0 every 1 second and write to .jpg files like img00000.jpg, img00001.jpg, ...
                                                                                                                $ helpme ffmpeg assemble all the .jpg files into an .mp4 timelapse video at 8fps
                                                                                                                $ helpme ffmpeg recompress myvideo.mp4 for HTML5-friendly use and save the result as myvideo_out.webm
                                                                                                            
                                                                                                            I know there are full blown AI terminals like Warp but I didn't like the idea of a terminal app requiring a login, possibly sending all my commands to a server, etc. and just wanted a script that only calls the cloud AI when I ask it to.
                                                                                                            • trevor-e 7 hours ago

                                                                                                              Yea agreed, these kinds of websites feel obsolete now with LLMs. I just tried a couple in ChatGPT and it worked flawlessly.

                                                                                                              • dmonitor 7 hours ago

                                                                                                                Where do you think the LLMs get their ffmpeg commands from?

                                                                                                          • sergiotapia 5 hours ago

                                                                                                            if you're the creator might I suggest an ai.txt like a robots.txt of all the content? so we can pass it to an LLM and use it to create custom commands we need based on real needs? that would be awesome!

                                                                                                            • Philpax 5 hours ago

                                                                                                              I wouldn't be surprised if most LLMs already knew how to do most of these out of the box.

                                                                                                            • mahdihabibi 7 hours ago

                                                                                                              Now I know what to read over the next weekend!