[HN Gopher] Ffmpeg Buddy
___________________________________________________________________
 
Ffmpeg Buddy
 
Author : thunderbong
Score  : 328 points
Date   : 2022-05-30 11:17 UTC (2 days ago)
 
web link (evanhahn.github.io)
w3m dump (evanhahn.github.io)
 
| soheil wrote:
| Would also love to see a vlc buddy.
 
| phailhaus wrote:
| Ooh, if this also used ffmpeg-wasm [1], you could then run the
| command itself in the browser!
| 
| [1] https://github.com/ffmpegwasm/ffmpeg.wasm
 
  | OzzyB wrote:
  | Hmmm... not really, irrc you will be bound by memory limits of
  | your browser/wasm context. Small videos would be fine, large
  | ones, not so much...
 
    | 0x62 wrote:
    | FWIW we've been using ffmpeg-wasm on one of our products [0]
    | for a couple months and the main issue is garbage collection.
    | You're limited to 4GB memory, but if you don't kill and
    | restart the workers every N operations it crashes the browser
    | tab (even with proper unlinking of files in the virtual FS).
    | 
    | I suspect you could still make it work with clever usage of
    | the File System Access API as a cache, and process larger
    | files in chunks. Then you'd mostly be limited by the Blob
    | storage limits [1], and memory required to merge processed
    | chunks together.
    | 
    | [0] https://nft-inator.com/app
    | 
    | [1] https://chromium.googlesource.com/chromium/src/+/224e43ce
    | 1ca...
 
      | marclundgren wrote:
      | It works great for audio. Here's a wasm-ffmpeg solution I
      | created trim audio.
      | 
      | https://wasm-audio-clipper.netlify.app/
      | 
      | Check the repo: https://github.com/marclundgren/wasm-audio-
      | clipper. I ended up lazily registering the context. The
      | memory footprint stays lower even after trimming multiple
      | clips on the same session.
 
| eevilspock wrote:
| Isn't the better solution for most users a GUI tool like
| Avidemux?[1] The point being that those who want to use the
| command line are precisely the people who need to understand all
| its complexity.
| 
| ---
| 
| [1] https://avidemux.org. Avidemux has a "built-in libavcodec
| library from FFmpeg (i.e. Avidemux contains its own copy of
| libavcodec, external FFmpeg is not used)"
 
| fareesh wrote:
| These are the easy ones. What would be amazing is the arcane
| incantations that mere mortals don't remember.
| 
| Another tool that this is nice for is imagemagick. Is there
| something newer than imagemagick for image generation these days?
| I'm having trouble with some non English scripts and draw text
 
  | NegativeLatency wrote:
  | Have you tried/considered trying it in an svg and then
  | converting to a raster format?
 
  | HellsMaddy wrote:
  | For a long time, I've wanted an interactive Imagemagick
  | interface that allows you to add/tweak flags and shows an
  | immediate preview. The Imagemagick site has something sorta
  | like this[0] but it's not very good.
  | 
  | My current workflow is to open the image in a viewer that
  | automatically reloads on change, like feh or sxiv, and then in
  | my terminal use  to run the command without clearing the
  | command line.
  | 
  | [0]:
  | https://magickstudio.imagemagick.org/scripts/MagickStudio.cg...
 
  | ehsankia wrote:
  | Indeed, these are very basic stuff, which may be useful for
  | some people's workflow, but then by the time I started remember
  | this website, I'll probably have already memorized the few
  | flags the website profiles anyways.
  | 
  | In my experience, you're just better off searching for what you
  | need, in my experience you'll always find a bunch of results
  | with the exact ffmpeg incantation you need for your specific
  | rare usecase.
 
| gubneor wrote:
| https://github.com/topics/ffmpeg-gui
| 
| https://github.com/MattMcManis/Axiom
 
| pt_PT_guy wrote:
| all of these I know by head.
| 
| the difficult part is to combine vaapi, codecs, re-encode audio
| without re-encode video (and vice versa), codec lists, etc
 
| donbronson wrote:
| This is excellent. Is there something like this for ImageMagick
| as well?
 
| Ansil849 wrote:
| The concept of this would be incredibly useful...I use FFmpeg
| every few weeks, which is not often enough to remember all the
| commands I need.
| 
| But the execution here is a bit lacking. This only lets you input
| basically 10 parameters.
| 
| If this were to be expanded to include all FFmpeg params, it
| would be INCREDIBLY useful.
 
| kortex wrote:
| Question for the peanut gallery, because it's vaguely topical and
| I've spent hours researching problem to no avail.
| 
| How can I mux arbitrary data streams into a container? Let's say
| I have a drone and I want to stream audio, video, and some
| avionics telemetry.
| 
| I know FFMPEG can _pass through_ data encoded, and it lists a few
| binary stream formats:                    ffmpeg -codecs | grep
| '^ ..D'  # shows all -c=d codecs              ..D... bin_data
| binary data         ..D... dvd_nav_packet       DVD Nav packet
| ..D... epg                  Electronic Program Guide
| ..D... klv                  SMPTE 336M Key-Length-Value (KLV)
| metadata         ..D... mpegts               raw MPEG-TS stream
| ..D... otf                  OpenType font         ..D... scte_35
| SCTE 35 Message Queue         ..D... timed_id3            timed
| ID3 metadata         ..D... ttf                  TrueType font
| 
| But I have no idea how to pack some new data stream into the
| filtergraph.
 
  | gyan wrote:
  | Is the data packetized and with timestamps?
 
    | kortex wrote:
    | The data has temporal component, yes. But how would I
    | packetize it in the first place? I have the high-level
    | concept that I need to take each of my data chunks and put
    | them into some kind of timestamped container/page/atom and
    | feed them into the stream, but I have no idea how to actually
    | emit those packets. Like let's say each time step I emit a
    | binary blob of msgpack-encoded data. How do I wrap that with
    | a timestamp/sequence number container?
 
  | nwallin wrote:
  | With -map. https://trac.ffmpeg.org/wiki/Map
  | 
  | ffmpeg -i input1.mkv -i input2.mkv -i input3.mkv -map 0:v -map
  | 1:a -map 0:d -c copy output.mkv
  | 
  | ...will take the video from input1.mkv, the audio from
  | input2.mkv, and the data stream from input3.mkv. If you
  | telemetry isn't already packetized, you'll need to do that
  | yourself. Converting your drone's telemetry into something that
  | ffmpeg likes is generally non-trivial.
  | 
  | At my day job I maintain a tool that takes a .csv file and a
  | raw video file and outputs a single file. Which can then be
  | viewed, with the data displayed on the map and such.
  | https://pro.arcgis.com/en/pro-app/latest/tool-reference/imag...
 
    | kortex wrote:
    | Many thanks!
    | 
    | > if you telemetry isn't already packetized, you'll need to
    | do that yourself. Converting your drone's telemetry into
    | something that ffmpeg likes is generally non-trivial.
    | 
    | Yes, this is exactly the non-trivial step I'm struggling
    | with. Let's say I have every time step a msgpack-encoded
    | binary blob with a timestamp. I want to packetize it and pack
    | it into a data stream of some timestamped/sequenced
    | packet/page/atom structures. I might be able to build those
    | packets myself manually if I can find a viable format (mkv
    | and ogg seem the easiest to reason about).
    | 
    | And ultimately I do want to do this with real-time streams,
    | but I'll definitely look at this Video Multiplexer to start
    | with! That at least scratches the itch of archiving this
    | data.
 
      | nwallin wrote:
      | Yup, unfortunately (but fortunately for my employer)
      | there's no off the shelf tool that does this. Ultimately
      | you just have to write a bunch of code.
      | 
      | There does exist a standardized way to encode the data:
      | MISB (Motion Imagery Standards Board) ST 0601:
      | https://nsgreg.nga.mil/doc/view?i=5093
 
| paulmd wrote:
| I say this with the best of intentions: I wish this went a little
| farther. A lot of the complexity comes from transcoding options,
| filters/transformations applied to the video/audio streams, and
| control of how the file gets put back together.
| 
| (And sometimes there are oddities about how they interact, or
| there is one option that seems very deprecated. It's like
| Eclipse, it's an engineer's tool, it's extremely powerful but god
| had no hand in the creation of the UX whatsoever, it is the
| unholy amalgamation of hundreds of modules that usually work,
| usually, mostly.)
| 
| Give me checkboxes for "resize this video", "convert framerate",
| "decomb filter", "burn hardsubs filter", a reasonable set of x264
| or x265 transcoding options, audio transcoding and downmux, and
| options for controlling how it all gets reassembled.
| 
| It might help to list out some simple use-cases and then look at
| the ffmpeg features that would be required to get there, and then
| support those. But again, it's sort of hard to capture everyone's
| use-cases, ffmpeg is such a swiss-army knife.
| 
| Personally I use it for:
| 
| * to direct-stream cut (no re-encoding) slices of videos for
| memes
| 
| * to handle game replay captures (sometimes with re-encoding,
| sometimes not) and combine separate audio tracks into a file for
| youtube
| 
| * to handle game replay captures (always with re-encoding) but
| with separate audio tracks preserved
| 
| * to cut out audio tracks/subs that I don't want from a given
| movie/show when it becomes annoying
| 
| * to transcode a movie/show for archival at the minimum
| size/maximum quality
| 
| etc
| 
| In particular I'm not sure how to really tell ffmpeg to handle
| multiple audio/sub streams without programmatic interaction - you
| kinda need to know there are 2 audio streams and 4 sub streams,
| because you need to tell it what to do with each stream you want
| included in the output file, even if you do the exact same thing
| to every stream. If you have one show that's a little weird,
| fine, but without some kind of front-end it gets difficult to
| handle _arbitrary_ content that is similar but not quite.
 
  | dylan604 wrote:
  | What's crazy is that there are so so many variations of GUI
  | options for FFMPEG. Typically, the GUI is limited by what the
  | creator's use of FFMPEG tends to be. Which by all means is not
  | a knock against it. It serves a purpose, and if it serves a
  | purpose for them it probably is useful to others in the same
  | way.
  | 
  | Then there are those that want a more generic version that
  | allows all the bells & whistles to become available in the GUI.
  | However, now you need to have a much better understanding of
  | FFMPEG which the vast majority of FFMPEG users don't know (I
  | myself learn new things everytime a new task is given).
  | 
  | At the end of the day, give it a go yourself to build a UI on
  | top of FFMPEG to expose all of the things you just requested
  | and see how painful it can be. I've done it multiple times for
  | multiple jobs and not one of them was the same. It gets even
  | more fun when you have sources with a combination of discrete
  | and interleaved audio streams with high channel counts. Now,
  | you have to probe the source and provide that info to the user
  | to allow for output audio considerations. Based on those, you
  | then need to potentially merge/join/split/map the audio. It's
  | maddingly fun to those with those sense of perversions like me.
 
    | paulmd wrote:
    | To me the most intuitive and flexible UI would be something
    | like Avidemux where you have a picker of filters/transforms
    | and you can add them to a box on the right (potentially you
    | can add them multiple times, etc) and then configure them.
    | That is a very powerful "general" UI flow that works
    | reasonably well imo.
    | 
    | But yeah you're right, it's all a question of how much
    | capability you want to surface, because the more you surface
    | the more quickly it gets complex and inscrutable to anyone
    | not in the know.
 
    | DANK_YACHT wrote:
    | The issue with FFmpeg is that it's complex, so you need to
    | understand what all the options do, but the interface is also
    | complex, so you need to understand how to format what you
    | want to do, even if you already have a good understanding of
    | what you want from FFmpeg. E.g. the order of different
    | options matter, applying some options to one stream vs.
    | another, chaining filters together, formatting the filters,
    | specifying the output options, etc.
 
      | paulmd wrote:
      | This is, btw, a great time to plug "bropages". Manpages
      | give you in-depth documentation on what each option does,
      | bropages the idea is to give you a synthesis of an actual
      | task being done with those command options, then you can
      | mix-n-match to fit your use-case (if necessary).
      | 
      | http://bropages.org/ffmpeg
      | 
      | The antidote to ffmpeg's arcane command-line has always
      | been finding someone else who already did it and seeing
      | what they did differently. There are, of course, many ways
      | to skin the cat in ffmpeg, but you often just need to see
      | some finished, working commands and start from there.
      | 
      | You could of course build that on a wiki somewhere, ffmpeg
      | does have various examples in their docs, but bropages is a
      | place to curate that sort of stuff.
 
        | thrtythreeforty wrote:
        | For even more brevity, there's tldr [1], which is short-
        | n-sweet "how do I do the most common things with this
        | tool."
        | 
        | You'll need a client for it (tldr itself is just the
        | database). I recommend tealdeer [2].
        | 
        | Example:                   $ tldr tar
        | Archiving utility.           Often combined with a
        | compression method, such as gzip or bzip2.           More
        | information: .
        | [c]reate an archive and write it to a [f]ile:
        | tar cf target.tar file1 file2 file3
        | [c]reate a g[z]ipped archive and write it to a [f]ile:
        | tar czf target.tar.gz file1 file2 file3
        | 
        | [1]: https://tldr.sh/
        | 
        | [2]: https://github.com/dbrgn/tealdeer
 
      | dylan604 wrote:
      | ^An issue with FFMPEG
      | 
      | This isn't THE only issue with FFMPEG. There are many many
      | problems with FFMPEG, but it's the best thing we have in
      | this area. Warts and all, I would probably, no, definitely
      | would not have been able to achieve many of the career
      | accomplishments I have without it.
      | 
      | As you start to reveal the multitude of
      | switches/options/etc available to FFMPEG via GUI, the GUI
      | becomes gnarly and complicated very quickly. This then
      | becomes just as daunting to the avg user as trying to build
      | the command itself. There are many practical uses for a
      | very simplified GUI to achieve a limited set of
      | functionality. There's nothing wrong with it. In fact, I'd
      | be willing to guess that if a UI came along that exposed
      | every single thing that FFMPEG could do, fewer people would
      | use it than a much more simplified version.
 
        | DANK_YACHT wrote:
        | GStreamer has a much more sane CLI interface. FFmpeg
        | generally works better than GStreamer, but it's
        | definitely possible to make a better command line
        | interface.
 
        | paulmd wrote:
        | Yeah "modules that mostly work, usually, mostly" is no
        | joke. And it's not that anyone really could do anything
        | significantly better than ffmpeg, it is probably one of
        | the best examples besides the kernel of an astonishingly
        | complex library that is run extremely competently but the
        | task space is just maddeningly complex and full of wild
        | edge-cases. Especially when dealing with "legacy" formats
        | and codecs from the 90s and early 00s - even today, have
        | fun transcoding RealVideo or ASF files with some weird
        | color space that nobody has used in 20 years.
        | 
        | There are infamously a lot of tasks that "look easy
        | upfront but have a lot of underlying complexity" and
        | ffmpeg is not one of them. It's a task that looks hard
        | upfront and then when you get down into the weeds it's an
        | eye-bleeding eldritch monstrosity.
        | 
        | The consensus around MP4 and MKV containers and some
        | relatively small number of codecs (H264, H265, VP1, AV1,
        | etc) has substantially eased things but video codecs,
        | audio codecs, and container files are just complicated
        | af.
        | 
        | And believe it or not - this is still way, way better
        | than it used to be! Flaskmpeg was never stable,
        | Virtualdub was nice but development ended with avi
        | container files, there were some forks that added various
        | features, etc, but ffmpeg and OBS Studio both actually
        | just work incredibly well compared to what came before.
 
        | dylan604 wrote:
        | >has substantially eased things
        | 
        | except not everyone has decided to use that easing of the
        | things. it seems like they go out of their way to make
        | things difficult
        | 
        | My favorite is in how MP4s are not all the same. A video
        | captured on a DSLR or other acquisition camera source
        | might have +/- in the video/audio sync when imported into
        | an NLE. Yes, the container utilizes PTS syncing to
        | playback the video/audio streams in sync, but this +/-
        | slop in sync is annoying AF to professionals capable of
        | seeing the sync slop. Average consumers probably never
        | notice. I thank all the gawds in all the heavens that I
        | no longer have to edit MP4 source captured content and
        | all of the manual slipping in the NLE.
 
        | scottlamb wrote:
        | If you want a single tool/library that does all the
        | things ffmpeg does, I agree. ffmpeg does lots of things,
        | some of them are inherently extremely complex, and it
        | puts them together cohesively. That's impressive! I think
        | the closest competition is gstreamer, and gstreamer ends
        | up calling into ffmpeg for software H.264 decoding...
        | 
        | But...sometimes you want one particular thing, that thing
        | is relatively simple (compared to e.g. H.264 decoding),
        | and you have needs ffmpeg doesn't meet. Then you probably
        | can do better. A couple examples that have come up for
        | me:
        | 
        | * specialized .mp4 muxing. My NVR project does this in a
        | way where it can do HTTP range serving, so put the moov
        | up front, produce the length quickly, and produce a given
        | byte range without iterating through all the bytes
        | before. ffmpeg can't do that, understandably. Hard to do
        | in a general-purpose library; the container muxing input
        | interface doesn't expect all the necessary information is
        | available up front. But it's not that bad as a one-off.
        | As you say, the consensus around a small number of
        | containers really helps.
        | 
        | * RTSP. Consistent with your "modules that mostly work,
        | usually, mostly", ffmpeg has various long-standing bugs
        | in its RTSP handling (e.g.
        | https://trac.ffmpeg.org/ticket/5018), has the risk
        | associated with protocol handling in a non-memory-safe
        | language, doesn't have much of a test framework for this,
        | etc. This problem is relatively approachable (though
        | hardly trivial), so I had success making my own library.
 
        | [deleted]
 
      | thrdbndndn wrote:
      | Agreed. At this point probably just use CLI.
      | 
      | One thing I hate about CLI tool though, is that it's very
      | hard to edit long commands in terminal.
      | 
      | For example, to replace the input filename from the
      | previous command. I can do it in one second with my
      | keyboard + mouse (use the mouse to select the old one, and
      | type in the new one which would replace) in editor but you
      | can't do so in terminal.
      | 
      | Another example is to change the order of some switches.
      | Again very easy in text editor, not so much in terminal.
      | 
      | So, everytime I use FFMPEG for some complex one (especially
      | when I need to go through trial and error, I have to write
      | the thing in a text editor and them paste them into
      | terminal.
 
        | paulmd wrote:
        | > One thing I hate about CLI tool though, is that it's
        | very hard to edit long commands in terminal.
        | 
        | Apart from the "wrap it in a shell script" advice, I
        | would also note that in a bash-like terminal, home and
        | end will jump to the start or the end of the current
        | command buffer, and ctrl-del (or alt-del maybe?) or ctrl-
        | arrow keys usually delete or move the cursor a whole word
        | at a time, which makes it somewhat quicker to work rather
        | than sitting there holding an arrow key or backspce.
        | 
        | Many here probably already know this, some may not!
 
        | thrdbndndn wrote:
        | Thanks, yeah I know these since I use them heavily in
        | editor as well.
        | 
        | Now this got me thinking: the main problem with terminal
        | is that it doesn't seem to support "cut" (and
        | consequently, "paste to replace selection"). So re-
        | arranging a command string is _always_ gonna be a pain
        | regardless the complexity.
        | 
        | I can see why it was this way historically, but not
        | exactly sure why no modern terminal emulator gives this
        | feature, even as optional.
 
        | paulmd wrote:
        | one analogy might be the "cut and accumulate" feature in
        | nano (and probably others) where a line is removed and
        | appended to the clipboard, then you can paste and all
        | those lines will be pasted off the clipboard at once. You
        | could do that at a character level in the shell, if you
        | wanted. No idea if any shells do though.
 
        | noir_lord wrote:
        | ctrl-x e
        | 
        | > It's a small key sequence: ctrl-x e . What's this do?
        | It takes the existing command that you currently have on
        | your command line and opens it in your shell's editor
 
        | remram wrote:
        | It's ctrl-x ctrl-e
 
        | [deleted]
 
        | dylan604 wrote:
        | >One thing I hate about CLI tool though, is that it's
        | very hard to edit long commands in terminal.
        | 
        | Only a madman would do this. I don't know anyone that's
        | in the middle of R&D that builds directly in the CLI
        | that's sane. Everyone tries it, and just at the point of
        | losing sanity, does the rational thing of building the
        | command in a text editor for a simple copy&paste into the
        | CLI later.
 
        | benfrancom wrote:
        | Yep, or turn it into a script and use an IDE/Vim/etc and
        | test in the terminal.
 
  | res0nat0r wrote:
  | I've been using ffmpeg-python recently, and it will do a lot of
  | the crazy complex transforms for you, and you can write sane
  | python code vs. trying to deal with the crazy default ffmpeg
  | syntax.
  | 
  | https://github.com/kkroening/ffmpeg-python
 
  | elesiuta wrote:
  | > In particular I'm not sure how to really tell ffmpeg to
  | handle multiple audio/sub streams without programmatic
  | interaction - you kinda need to know there are 2 audio streams
  | and 4 sub streams, because you need to tell it what to do with
  | each stream you want included in the output file, even if you
  | do the exact same thing to every stream.
  | 
  | I made a script that converts all the videos in a directory
  | above a certain bitrate to H.265 to save space and found that
  | just using the flags `-map 0` to grab every stream, and `-c:s
  | copy` was enough to avoid having to probe the source for every
  | stream since subtitles were the most problematic if any streams
  | were bitmaps. It then checks if there were any errors before
  | replacing the original video. I still get the occasional
  | outlier that I either fix by hand or just leave as is.
  | 
  | Also the script was written with python and argparse, so it
  | would be relatively easy for me to create a GUI with Gooey[1]
  | if there was interest.
  | 
  | [1] https://github.com/chriskiehl/Gooey
 
  | cm2187 wrote:
  | A good reason why it cannot be web based, you need to scan the
  | source video to be useful, so you know which tracks are
  | available (some subtitles aren't supported by ffmpeg). If you
  | merge two files the fps or resolution might not be compatible.
  | I think this calls more for a (or rather multiple) desktop
  | apps.
 
  | SomeHacker44 wrote:
  | My most common use case is to make something fit into a certain
  | file size. It usually takes a few tries with 2 pass encoding to
  | get an audio bitrate/downmix, video bitrate, framerate and
  | resizing to find one I like. It would be great to automate
  | that.
 
    | paulmd wrote:
    | The way I typically approach this personally is to have a
    | batch script that kicks off a couple "trial" encodes that run
    | with "medium" quality (which will run reasonably fast) and
    | then once I've identified an appropriate CRF value then I run
    | a final encode with "placebo" quality.
    | 
    | Once I have identified a target CRF then I just apply that
    | value to all similar files. I'm personally not concerned
    | about exact size, I'm not squeezing them onto discs or
    | anything, so having one file be 690mb and the next one be 695
    | mb is fine.
    | 
    | Contrary to the name, and contrary to popular belief: yes,
    | placebo does still improve quality noticeably even over
    | veryslow, when you are squeezing bitrate very hard. Actually
    | typically you will get a noticeably smaller file than
    | medium/slow (10% reduction is not atypical) and the quality
    | will be better than veryslow. This applies less when you are
    | giving adequate levels of bandwidth but when you are really
    | squeezing the bitrate to the absolute limit (I've been known
    | to use values in the CRF 31-37 range at some times to really
    | go hard), going deeper into motion search yields more
    | benefits. Like, you probably could still benefit from going
    | even farther (placebo is just a preset tuning some motion-
    | search parameters and you could tune them even higher).
    | 
    | At a minimum, veryslow does produce very significant quality
    | gains over medium even if you don't want to go all the way to
    | placebo though. Worth it for archival for sure.
    | 
    | And typically, the situation where I'm hand-tuning a file to
    | hit an exact file limit... are ones where I'm seriously
    | pushing the limits in terms of what I can fit into a given
    | attachment-uploader file size limit or something. So when I
    | am targeting a fixed file size I am almost always squeezing
    | hard.
    | 
    | There's no perfect solution to avoid the trial-and-error
    | process though, imo. Automated solutions can produce
    | something reasonable but not optimal in terms of exactly
    | hitting your filesize limit at the maximum possible quality.
    | Tuning it down to the last MB, or deciding to resize a video
    | to give a bit more motion bandwidth, isn't something that
    | they can generally do.
    | 
    | Personally I don't worry about audio too much - 160kbps AAC
    | or MP3 is fine and anything too far below that starts to get
    | potentially noticeably poor. If something has DTS or AC3
    | yeah, I'm transcoding because nothing will play that on the
    | internet, but if it's reasonably close I'll just copy source
    | to avoid generational losses fromt anscoding. Yeah, sometimes
    | a reduction in resolution can produce big gains with little
    | noticeable quality gain... and sometimes (especially with
    | anime/cartoons) a high-res file has so little high-frequency
    | data that going big barely affects file size at all. Tune
    | mode can also help a little bit at the edges.
    | 
    | I never mess with framerate or bit depth/color space unless I
    | absolutely have to, though. Too many pitfalls there.
 
  | teh64 wrote:
  | Have you had a look at Handbrake (https://handbrake.fr/)?
  | 
  | At least some of your requirements are directly implemented in
  | Handbrake, e.g., there are different transcoding presets [0]
  | and burning in subs [1]. It uses ffmpeg under the hood as well.
  | 
  | [0] https://handbrake.fr/docs/en/1.5.0/technical/official-
  | preset... [1]
  | https://handbrake.fr/docs/en/1.5.0/advanced/subtitles.html
 
    | paulmd wrote:
    | Yes. I ended up abandoning handbrake for a lot of reasons.
    | For a long time its libraries were horrifically out of date
    | (it was many many major versions behind the x265 trunk) and I
    | don't feel like its "presets"/"batch mode" works properly. I
    | always felt like I was second-guessing whether my manual
    | settings were getting overridden and replaced by presets when
    | inserting a batch.
    | 
    | I could have dived into the log files and looked more closely
    | at what it was doing but, eh, I'm at the level where I just
    | want a batch script where I can see exactly what it's doing
    | upfront. If I want batching/task management that is more
    | advanced than a batchfile can do I'll set up SLURM workload
    | manager.
 
    | radicality wrote:
    | Not op, but I did use Handbrake multiple times, and thinking
    | of just going back to cli ffmpeg. I wanted to see the exact
    | incantation of ffmpeg that Handbrake issues to more easily
    | switch, but from what I saw it doesn't fork into an ffmpeg
    | process but probably uses the library, and it's hard to tell
    | what the exact params are.
    | 
    | My problem with Handbrake was that it wasn't correctly
    | copying creation datetime/makernotes/camera info into the new
    | video and I had to manually later on issue bunch of ffmpeg
    | commands for copying stream metadata, at which point I might
    | as well do the whole conversion directly in ffmpeg.
 
      | cm2187 wrote:
      | The thing is depend what you are trying to do. To compress
      | DVD/Blurays, I find handbrake invaluable, because it will
      | automatically deal all kind of weird corner cases in term
      | of pixel format, image ratio, cropping, deinterlacing, etc,
      | that I don't have to write in a command line on every new
      | file (and every disk seems to be doing something
      | different).
      | 
      | But if you are dealing with repeatable, consistent file
      | format (like files coming from the same camera), you are
      | way better off going the command line route, and chances
      | are the command will be pretty simple.
 
  | aidenn0 wrote:
  | Something that always frustrated me is how much better avisynth
  | is than ffmpeg on pretty much every axis. Some of this is just
  | because VFW puts any linux video stack look like a bit of a
  | joke, but even something limited to the features internal to
  | ffmpeg using the avs language would be better than this crazy
  | -map -vf -af -filter_complex bag of command line options.
 
    | motbob wrote:
    | Yeah, once you get above a basic level of filter complexity,
    | Vapoursynth/Avisynth become much easier to script. The
    | problem is that it's hard to do the initial setup of *synth.
 
    | dylan604 wrote:
    | >Some of this is just because VFW puts any linux video stack
    | look like a bit of a joke
    | 
    | What's the joke? I thought using VFW in 2022 was pretty
    | hillarious of a suggestion. Maybe you got the punchline
    | confused? ;P
    | 
    | AVISynth died to me long long ago as it was just no longer
    | pratical. The work arounds to get 10bit video was never
    | stable by the time I dropped it.
    | 
    | I did enjoy the scripting aspect of things like you suggest,
    | but that's meh at this point. Now that my brain has been
    | rewired to think FFMPEG like, the frustration goes away. It's
    | a steep hill to climb without question, but eventually, it
    | just goes "click".
 
      | aidenn0 wrote:
      | 1. I suspect we have very different needs. I've never
      | worked with 10 bit video, for example.
      | 
      | 2. The closest equivalent to VFW in linux is not ffmpeg but
      | gstreamer. My experience with the latter is ... not good.
      | 
      | 3. ffmpeg is great _when it does what you need_ but VFW
      | lets you draw from a vast ocean of third party plugins that
      | do all sorts of niche things.
 
  | urda wrote:
  | https://github.com/EvanHahn/ffmpeg-buddy
  | 
  | If ya can maybe help em out and send a pull request? I think
  | it's a neat little app and will take a look at it myself.
 
  | pkulak wrote:
  | I just use Kden Live for anything at all complicated. It
  | basically just generates an ffmpeg command anyway.
 
  | throwaway894345 wrote:
  | I'm an FFMPEG newb, but I can't find anything that handles
  | subtitles correctly by default. Just leave all of the subtitles
  | on (it's not like they take up any appreciable amount of space
  | compared to the audio and video streams). If the output format
  | requires a different type of subtitle, just convert it (rather
  | than omitting the subtitle altogether). It's surprising to me
  | that everyone has to learn FFMPEG in all of its complexity to
  | do relatively basic things.
 
    | [deleted]
 
  | bambax wrote:
  | > _In particular I 'm not sure how to really tell ffmpeg to
  | handle multiple audio/sub streams without programmatic
  | interaction_
  | 
  | This is what gets me every time. I'm relatively proficient with
  | ffmpeg (relatively!) but for the life of me I can never
  | remember how to switch audio sub streams or drop some of them,
  | etc.
  | 
  | And yes, one first needs to find out what's where, but there
  | are many UI tools that can do this (in addition to ffprobe).
 
  | mdre wrote:
  | Check out Hybrid, it's the most full featured GUI codec tool I
  | know. Amazing tool for video pros.
 
    | dylan604 wrote:
    | Hybrid or Hybrik now owned by Dolby?
 
    | sehro wrote:
    | https://www.selur.de/ is where Hybrid can be found.
    | 
    | Not associated, just find it easier to link to something
    | useful.
 
| m-p-3 wrote:
| Regarding scaling while maintaining ratio, some codecs will give
| an error if you try to put a size that isn't a multiple of n, for
| example if you put -2 you'll actually have it calculate the
| appropriate multiple of 2.
 
| clone1018 wrote:
| I ended up making something similar (except in reverse) for the
| x264 options you can pass in:
| http://axxim.net/~clone1018/tools/x264.html
 
| chungy wrote:
| ffmpeg is a really powerful tool that's well worth learning. It's
| become my go to for almost every video, audio, and still image
| task.
| 
| One thing that might help: ffmpeg is, in fact, the Unix
| philosophy of "do one thing and do it well", it just so happens
| that all the commands are prefixed by the ffmpeg command, but you
| can break things down really easily after that. Each codec is
| independent, mappings are independent, filters, etc.
 
  | wingworks wrote:
  | Something I don't think many talk about, the fact that ffmpeg
  | can input and output images, and does it really quick.
  | 
  | Recently I was working on processing large images (100-200MB
  | per jpg) which needed a crop, some added text and "progress
  | bar" for a timelapse. I started with imagemagick, it was super
  | slow, so tried graphicsmagick, also slow, just somehow I
  | thought, why not try ffmpeg. Man, it's night and day
  | difference. It processed my images super quick (from ~30
  | seconds down to ~1 second), and had surprisingly good
  | documentation (compared to IM/GM), and allot of support on
  | stackoverflow etc.
 
| hardwaregeek wrote:
| It's interesting. I've heard apocryphally that FFmpeg is used in
| many production video systems
| (https://twitter.com/id_aa_carmack/status/1258531455220609025).
| However, as far as I can tell, you can either use the quite low
| level libraries like libavfilter, or you can rely on the CLI
| tool. The former seems rather tedious; you have to set up the
| scaffolding yourself, chain all the demuxer to the filters to the
| muxer, etc. The latter is a very weird interface; you have to
| shell out to this CLI tool. Is that really the case?
 
  | the_cat_kittles wrote:
  | whats the problem with using the cli in production?
 
    | make3 wrote:
    | requires creating a separate process? requires passing the
    | memory from one process to the other.. requires a filesystem
    | & requires the security analysis for having production
    | software interact with the file-system?
 
      | chrisseaton wrote:
      | > requires a filesystem
      | 
      | Unix has something called pipes that lets you send data as
      | 'files' but they're really supplied as a stream by another
      | process.
 
    | bityard wrote:
    | Yeah, I don't really see the difference between asking a
    | database administrator to be fluent in SQL and asking a video
    | processing expert to be fluent in ffmpeg (or similar tools).
 
  | Uehreka wrote:
  | I've had some luck with PyAV, which I'm pretty sure is just
  | some straight-up Python->C bindings (in case shelling out and
  | starting another process feels too weird.
  | https://pyav.org/docs/stable/
  | 
  | However, I'd note that in my use case, I ended up going back to
  | the shell after running some benchmarks and seeing that for my
  | use case, I wasn't saving any performance.
 
| 01100011 wrote:
| Seems like this would be nice to have an an interactive shell
| script(or compiled, for cross platform support) that ships
| alongside ffmpeg...
 
| dontbenebby wrote:
| I wanted to make something like this (minus the gui) for a long
| time... thank you very much OP, I am bookmarking this.
 
  | m-p-3 wrote:
  | So a TUI?
 
  | alex_duf wrote:
  | So if you remove the GUI you'll only have the CLI, so what you
  | want is the ffmpeg CLI?
 
    | nvrspyx wrote:
    | I'm not the parent, but not necessarily. You can have this
    | same exact "GUI" implemented as a TUI, using something like
    | Bubble Tea[0], Textual[1], or by hand. You'd get a similar
    | experience without having to go back and forth between the
    | terminal and a browser.
    | 
    | [0]: https://github.com/charmbracelet/bubbletea
    | 
    | [1]: https://github.com/Textualize/textual
 
| spinaltap wrote:
| Question: this tool offered start-time and end-time, but no
| toggle about "accurate seek"? I've always been confused about the
| `-noaccurate_seek` flag (when cutting clips with `-c copy`).
| 
| I use this flag because I don't need accurate seek, but sometimes
| it works, sometimes it doesn't. When it doesn't work, there will
| be a few seconds of frozen image at the beginning of the cut.
| Don't know how to solve it.
 
  | ThatPlayer wrote:
  | Isn't that only relevant because you're using -c copy? Without
  | transcoding, ffmpeg will just copy the stream from that start-
  | time. But because video codecs store data as incremental
  | updates to a keyframe, without transcoding, those first few
  | seconds will be useless data. -noaccurate_seek looks for the
  | keyframe so you do not have that useless data.
  | 
  | Proper terms are i-frame and p-frame.
  | https://en.wikipedia.org/wiki/Video_compression_picture_type...
  | 
  | Though according to the ffmpeg docs on -ss, it should be doing
  | noaccurate_seeks if you're doing stream copy.
  | 
  | Also I'm unsure about this, but I think the audio stream can be
  | cut at a different location than the video stream, leading to
  | the frozen frame, and different video players seem to handle it
  | differently. I've got a clip I've made, with transcoded video
  | stream but copied audio stream, that is 1:06 on Firefox with
  | the extra audio at the beginning, but 1:03 on VLC, MPC, Chrome,
  | and desynced in Edge. Extracting the audio with ffmpeg again
  | gives a time of 1:04.02 compared to a video stream of 1:03.
 
| btbuildem wrote:
| Last time I went down the ffmpeg man page rabbit hole was when I
| needed to vertically stack (and temporally align) feeds from
| multiple timelapse cameras to make videos for IG stories.
| 
| As soon as the carefully curated string of option configurations
| went into a script, it also evaporated from my brain. Oh well..
| til next time.
 
| bigdict wrote:
| Looks great, now do the other million available options.
 
| radicality wrote:
| Kinda related, here's a few ffmpeg commands i've probably spent
| many hours getting to work just right recently (and they might
| not even the right way to do these things), perhaps someone will
| find it helpful. All of these are on a macbook.
| 
| - play facetime camera (or any avfoundation camera, like a
| capture card) to mpv                 ffmpeg -f avfoundation
| -video_size 1920x1080  -framerate 30 -drop_late_frames true -i
| "FaceTime HD Camera" -c:v rawvideo -f matroska -r 30 - | mpv
| -profile=low-latency -untimed -
| 
| - play raw video stream from the usb camlink capture card
| ffmpeg -f avfoundation -video_size 3840x2160 -framerate 23.98
| -pixel_format uyvy422 -drop_late_frames true  -i "Cam Link 4K"
| -c:v rawvideo -f matroska - | mpv -profile=low-latency -untimed -
| 
| - Capture video, and do live HVEC hardware encoding on apple
| hardware and save result. Control quality with q variable. q=85
| is around 250Mb/s:                 ffmpeg -f avfoundation
| -video_size 3840x2160 -framerate 23.98 -i "Cam Link 4K" -c:v
| hevc_videotoolbox -q:v 85 -r 23.98 -tag:v hvc1
| _x265.mp4
| 
| - Use named pipe with mkfifo to play a stream. Sometimes this
| produces less input lag than other methods.
| mkfifo /tmp/fifo1       cat /tmp/fifo1 | mpv -profile=low-latency
| -untimed -       ffmpeg -f avfoundation -video_size 1920x1080
| -framerate 30 -drop_late_frames true -i "FaceTime HD Camera" -c:v
| rawvideo -f matroska -r 30 - > /tmp/fifo1
 
  | Tijdreiziger wrote:
  | The first two might be possible with just MPV. Relevant thread
  | on /r/GenkiLab:
  | https://www.reddit.com/r/GenkiLab/comments/mzw9a2/lower_late...
 
| kosolam wrote:
| Very cool. I would love to see something like that with more
| ffmoeg options
 
| dusted wrote:
| Neat tool and a fine introduction to doing very basic things with
| ffmpeg. A tool I'd find interesting and useful is one that lets
| me graphically do everything with the advanced filter graph that
| can be done with the commandline, in an easy and intuitive way
| (spoiler alert: extremely hard to impossible task)
 
| linesinthesand wrote:
| A nice start, but definitely needs some complex_filter options
 
| Nathanael_M wrote:
| The first time I heard about ffmpeg was last night when I had to
| concatenate a few hundred thousand videos. So slick, so quick,
| but it took a bit to figure out the command structure. Guess I
| found this 12 hours too late, haha!
 
  | cedricd wrote:
  | A few hundred thousand videos? I'm super curious what your use
  | case was. I really can't imagine the scenario for this :)
 
    | geraldwhen wrote:
    | I'm guessing security camera motion detection footage for
    | archive.
 
| aasasd wrote:
| Pfah, if my wishes were so simple I'd barely need the man page.
 
  | xigency wrote:
  | I would use this tool if it had these options:
  | 
  | - x264 settings as well as copy video codec
  | 
  | - aac re-encoding settings
  | 
  | - mixing 5.1 to 2.1 audio
  | 
  | - adding multiple subtitles
  | 
  | - rendering hard subtitles
  | 
  | I was just using ffmpeg to convert videos to watch on the TV
  | and I needed all of those.
 
| victorwestmann wrote:
| This is as simple as revolutionary. Thank you so much for putting
| this together!
 
| 1970-01-01 wrote:
| See also
| 
| https://github.com/FHPythonUtils/Cli2Gui/
| 
| It's 2022, shouldn't CLI to GUI conversion be an automatic and
| core feature of every OS by now?
 
| doersino wrote:
| I see that we're sharing our lists of magical FFmpeg incantations
| - here's mine: https://github.com/doersino/ffmpeg-koraktor
 
| VyseofArcadia wrote:
| Why is this a webpage? It would be a little more useful as a
| local program that actually just runs the command for you instead
| of having to copy-paste everything to your terminal.
 
  | hbn wrote:
  | A webapp is automatically cross-platform, and also installing a
  | program requires more buy-in from a user. I wouldn't have
  | played around with this if I had to vet whether it was from a
  | trustworthy source and install it to my machine.
 
| Hello71 wrote:
| Selecting both scale and rotate options results in:
| Multiple -filter, -af or -vf options specified for stream 0, only
| the last option '-filter:v transpose=1' will be used.
| 
| -vn, -an, -ss, and -to are specified as output rather than input
| options, which are much more efficient.
 
  | dylan604 wrote:
  | just from this comment, using -filter_complex seems like a much
  | better option. in fact, on past experience, I couldn't see
  | myself building an FFMPEG command builder and not use
  | filter_complex.
 
| runlevel1 wrote:
| Some codecs, like h264, require the width and height be divisible
| by 2. Scaling with -1 will sometimes fail because of that.
| 
| If you use -2 instead it will adjust so that it is even.[^1]
| 
| For example:                   ffmpeg -i input.mp4 -vf
| scale=720:-2 output.mp4
| 
| [1]: https://trac.ffmpeg.org/wiki/Scaling#KeepingtheAspectRatio
 
  | hombre_fatal wrote:
  | It reminds me of a similar quirk where scaling by a single
  | pixel _extra_ in either dimension can introduce disproportional
  | blurriness, so one solution is to pad by a 1px wide border on
  | the would-be odd dimension.
  | 
  | This has saved me a lot:
  | https://stackoverflow.com/a/53024964/511200
 
| misil wrote:
| I think I once read a comment on here that the command-line
| parsing logic of ffmpeg is Turing-complete. It's probably telling
| that I can't remember if that was meant as a joke or to be taken
| seriously. And I say this with nothing but admiration for the
| tool.
 
| gosub wrote:
| Can I have magit for ffmpeg and openssl, please?
 
| butz wrote:
| What about a decoder, to parse ffmpeg command from my old bash
| file to tell exactly what it is doing, maybe even suggesting some
| optimizations?
 
___________________________________________________________________
(page generated 2022-06-01 23:00 UTC)