Hacker News new | past | comments | ask | show | jobs | submit login
FFmpeg 4.2 (ffmpeg.org)
327 points by gyan on Aug 6, 2019 | hide | past | favorite | 79 comments



Massive "thank you" to FFmpeg for being an amazing tool.

My app pivotally depends on FFmpeg extracting screenshots of videos for users to browse through: https://github.com/whyboris/Video-Hub-App


If you're making money from it, why not donate for future development? http://ffmpeg.org/donations.html


This software is available for $3.50 through videohubapp.com $3.50 of every sale goes to the cost-effective charity Against Malaria Foundation.

Appears to donate 100% straight to Charity by the looks of it.


The text is rather confusing. Why not directly mention that the money is fully donated?

It's great that the author likes supporting a charity/foundation, but as a customer, I would expect my money to be used to maintain and further develop the software I pay for. Having all the money directly getting donated, makes me slightly worry about longevity/maintenance of a product...


Author here. I need to clarify my messaging on the website: $3.50 gets donated with every purchase (even though after fees a $3.50 purchase results in about $3.00 going to my account). The people who choose to pay more (there are many!) cover the fees -- huge "thank you" to them.

I'm releasing version 2 in the next 2 months: anyone who ever bought the software (700+ people) will get the download link in their email.

I keep a log of all the donations: https://videohubapp.com/blog.html -- you can click to see the charity website log as well: https://www.againstmalaria.com/VideoHubApp

Happy to answer any questions :)


Maybe if you buy something for $3.50 you should always be slightly worried about the longevity/maintenance of the product...


Aweseome, I've been looking for something like this forever. I hacked my own solution using Spring Boot and Angular but not nearly as many features.


In case anyone is confused with FFmpeg, ffmpeg, libav. etc., follow [0]:

[0] https://stackoverflow.com/questions/9477115/what-are-the-dif...


first I've heard of any of these. I've always just apt installed ffmpeg from my distro. Works perfectly.


At some point in time that wouldn't have installed ffmpeg, but libav instead.


So what is the difference? This comment looks to be adhomenum remarks on forks.

If it’s clear and I’m just missing it, sorry i have a temp of 102.3 so I’m a little hazy.


Most of the core contributors had a fight with the project lead, so many of them left the project and forked into libav.

So the community and the projects both split, and both fought about being the real one. And at first, ffmpeg focused only on features, regardless of code quality, while libav focused on clean code, even if that meant compromising on features.

Obviously, people who aligned with the project lead, and people wondering why stuff suddenly didn’t work anymore, were fed up with libav. Even though it was a situation where libavs codebase was, compared to ffmpeg, much cleaner, similar to openssl vs libressl, but sacrificed a huge amount of functionality for that goal.

EDIT: Rephrasing for accuracy


If you check this link[0] you can see most of your statement about FFmpeg merging everything and Libav being all about clean code is just completely false. Apparently lots of hardcoding and weird NIH on the Libav side, and a biased Ubuntu package maintainer to boot.

[0] http://blog.pkh.me/p/13-the-ffmpeg-libav-situation.html


I can vouch for this being impartial and generous at the time, with context – without context it reads a little too much like hectoring


That linked article is from 2012, still relevant? In other words, has some of the things mentioned changed?


The big change since then is that Debian switched back to ffmpeg:

https://lwn.net/Articles/650816/


Libav mostly died over the last ~2 years, with the developers either returning to ffmpeg or moving on entirely.


I have no bone in this fight, but this is an egregiously terrible and biased summary. I will pick some of the most ridiculous points here to rebut, but a better summary could be found in literally any of the search results for "ffmpeg libav".

> The project lead had a fight with all the other core contributors

There was longstanding animosity between the project lead and other developers, due to a variety of reasons, mainly his dictatorial leadership style.

> everyone but the lead left the project and forked into libav

A small set of contributors with technical control over certain infrastructure removed the lead's access.

> So the community and the projects both split, and both fought about being the real one.

This contradicts your previous claim that "everyone but the lead left the project".

> And at first, ffmpeg focused only on features, regardless of security, while libav focused on security and clean code, even if that meant compromising on features.

This is ridiculous. libav did remove a large amount of code that was working, some of which may have been insecure or not designed well, but a lot of which was actually necessary for people's workflows and not "dead code" as they claimed. Moreover, ffmpeg had a significantly better security profile than libav due to actually patching bugs rather than waiting to do it right (which ffmpeg developers will argue was basically "doing it differently than ffmpeg").

> Even though it was a situation where libavs codebase was, compared to ffmpeg, much cleaner, similar to openssl vs libressl.

It wasn't cleaner, just less. It became more and more "less" when ffmpeg gained new (well-designed) features, and libav refused to merge them just because they were not designed by libav.


FWIW you definitely come off as though you have "a bone in this fight" while the parent does not.


> This is ridiculous

All you’re saying is repeating what I stated — libav removed unclean code and focused on cleaning it up, even if that meant losing a lot of functionality.

At the same time, ffmpeg merged pretty much everything, even if that lead to worse code, or security issues.

Yes, libav was slower in patching, but the goals with which it started were good in nature.

> There was longstanding animosity between the project lead and other developers, due to a variety of reasons, mainly his dictatorial leadership style.

That’s nothing different from what I said, I just tried to phrase it more nicely.

> It wasn't cleaner, just less. It became more and more "less" when ffmpeg gained new (well-designed) features, and libav refused to merge them just because they were not designed by libav.

More isn’t better. FFmpeg is one of the buggiest and most broken collections of code on this planet. Clean code, maintainability, and so on are actually important.

Look at libressl — they ripped out 90% of the functionality of openssl, cleaned up the API surfaces, etc. And yes, right now they’re still slower to patch some kinds of bugs than openssl, but once they patch them, they actually stay fixed, while each openssl patch opens a dozen new bugs.


Complete outsider (literally learning about this fight via this post), but I have to admit you seem somwhat biased:

> At the same time, ffmpeg merged pretty much everything, even if that lead to worse code, or security issues.

Do you have proof of this claim, especially for "security issues"?

> That’s nothing different from what I said, I just tried to phrase it more nicely.

Your phrasing makes it sound like the project lead was the instigator.

> FFmpeg is one of the buggiest and most broken collections of code on this planet.

Again, do you have proof of this? I'll admit my experience with ffmpeg is minor, but it seemed like a fairly normal software project when I worked with it rather than a buggy mess.


https://security.googleblog.com/2014/01/ffmpeg-and-thousand-...

https://alioth-lists.debian.net/pipermail/pkg-multimedia-mai...

I believe every major distro that jumped to libav has switched back. Some appearance of bias may be just a statement of fact. ffmpeg frequently merged changes from libav, but not vice versa. The newly commissioned (around the time of the fork) library libswresample for example was never brought over to libav, despite being far more ergonomic than libavresample.


> Your phrasing makes it sound like the project lead was the instigator.

Fixed that

> Again, do you have proof of this?

Most media code is already a huge bunch of a buggy mess, and more obscure codecs are usually the worst examples of this. Which is why gstreamer splits the codecs into groups based on how well they are maintained and how clean the code is.

If you read the CVE lists for ffmpeg, you’ll notice that a lot of them are in not so well maintained codecs or functionality (often in parts libav threw out, which annoyed the people who needed this), or in parts where ffmpeg reinvents the world.

It’s a common issue in many projects, and especially in the media world with obscure codecs which often only a handful of people — or only one person — even understand anymore it’s a major problem, and just like with OpenSSL/LibreSSL, it’s a good reason to rip this code out.


> Do you have proof of this claim, especially for "security issues"?

ffmpeg was known for overly strict code reviews before the fork, but afterwards Michael N. (the lead dev) merged every single libav commit back in without review and called it weird names like "Qatar" he thought were funny.

To be fair he was also schizophrenic and hallucinating. Good coder though.

> Your phrasing makes it sound like the project lead was the instigator.

He was quite difficult to work with, for instance you couldn't get him to delegate anything, and he wouldn't localize ffmpeg because it would take a few extra CPU cycles to look up strings in language tables.

I haven't been able to look at the project in a while but he's probably better.


Libav broke my scripts that had been working for years and had the audacity to claim ffmpeg was deprecated. I'm never glad when a FOSS project crashes and burns, but this is the exception that 'proves' the rule. Good riddance!


what security issues were prevented by libav's wholesale removal of working code? why did libav implement new ffmpeg features in gratuitously incompatible ways? why did libav print the hilariously defamatory "FFMPEG IS DEPRECATED" message?


> what security issues were prevented by libav's wholesale removal of working code?

ffmpeg has a lot of areas where the cold is old, barely maintained, and has many issues. Have you tried running ffmpeg through a static analysis tool? the resulting warning list will be so large, it wouldn’t fit on a floppy.

libav’s first action was removing such unclean code, which was a good thing, the project started with a good motivation, similar to libreSSL — they also ripped out 90% of working code to clean the codebase up.

> why did libav implement new ffmpeg features in gratuitously incompatible ways? > why did libav print the hilariously defamatory "FFMPEG IS DEPRECATED" message?

Humans are humans, and tribalism is everywhere. After such a fight, usually the groups both declare the other side wrong, and do everything in their might to make their position more popular. That’s not saying it’s justified, and I won’t make a judgement on these actions, nor am I going to declare which side was good or bad, just that libav started with some good ideals, before this happened.


TL;DR: Use ffmpeg

Man, if these reads like ad hominem, I wish you could read the whole story. The linked comment is admirably restrained to the point it prefers being confusing over explaining what happened (fwiw I have no dog in the fight, was privy to the goings-on because my project depended on ffmpeg)


Alright. Got it thank you.


> AV1 decoding support through libdav1d

Nice to see progress in the AV1 front!


What exactly is the "GIF parser"? I thought FFmpeg already did GIF I/O.


Don't know exactly, but https://trac.ffmpeg.org/ticket/1347 looks like the ticket and http://git.videolan.org/?p=ffmpeg.git;a=commitdiff;h=8f66d46... looks like the commit implementing it.


Looking at comments on https://stackoverflow.com/questions/53460876/process-gif-usi... there was only a demuxer, no parser. I'm not sure why you'd need a parser but according to https://superuser.com/a/787073 ffmpeg always treated GIFs as movies, so maybe this is a way to tell which GIFs are single images?


IIRC parsers let it reconstruct metadata from files that aren't muxed, or inaccurately muxed. For instance, you'd need one to read raw .h264 files properly into .mp4.

Not sure how that would apply to GIF.


Parsers typically are used to correctly demarcate packet boundaries in (coded) bitstreams e.g. H.264 bitstream is partitioned into NAL units and the parser assembles all relevant units for a single frame/slice so that the decoder gets everything it needs to decode that sample, nothing more, nothing less.


Well I should hope it does more by now because that's not enough information to mux an H.264 stream. You need to recover PTS/DTS offsets, keyframe types, SPS, etc.


> not enough information to mux an H.264 stream.

The parser is inserted after demux and before decode.

Yes, xPS are also located and decoded. My comment wasn't meant to be an enumeration. Specific tasks depend on the complexity of the bitstream syntax.


remember the dark ages when we had to actually care about codecs and which ones were installed at any given point in time?


Bwahaha, I still remember getting those 'codepacs' for Windows that'd install like 20 codecs at the same time, including one that was a thin wrapper around libav/ffmpeg. 99% sure half of those violated all kinds of EULAs and copyright issues.


> 99% sure half of those violated all kinds of EULAs and copyright issues.

by the time you got there you were way past that point.


Yup.. K-Lite Codec Pack, CCCP, etc.


> remember the dark ages...

BVLC.


Veni vidi vlc


Chromecasts don't support MPEG-TS. Suddenly had to care about that the other day.


Does this play nice with Python youtube-dl? [1] [2]. I want to run a python script on my computer that captures youtube audio of certain government meetings without first having to dl the entire video and convert it (while doing a bunch of other stuff before and after automatically, all without me touching anything).

[1] https://stackoverflow.com/questions/27473526/download-only-a...

[2] https://stackoverflow.com/questions/39665160/youtube-dl-pyth...


Unless you need to convert the audio format, I don't think you need ffmpeg at all - youtube-dl can just download the audio stream and save it to a file. Just list the available formats from a video and choose an audio-only format.


Also, IIRC youtube-dl will automatically re-encode it using ffmpeg if you pick an unavailable format!


Insome cases youtube-dl downloads the content via ffmpeg, see [1]

[1] https://github.com/ytdl-org/youtube-dl/blob/c3bcd206eb031de3...


will try thank you


Not sure what you mean, you're able to easily just use youtube-dl to download the audio only. Is the conversion suppose to change it into a certain filetype or something?


You neither need youtube-dl nor ffmpeg for that. JS userscript and wget is enough. Every YT page includes an array with links to all video/audio sources.


Try eg `youtube-dl -f 140 <URL>` to download just the .m4a audio stream.

`youtube-dl -F <URL>` will display the available formats.


youtube-dl -x <url> uses ffmpeg out of the box to extract mp3 audio from a video.


Can't say I blame them for the removal of libndi-newtek, given the situation, but I wish FFMpeg (and gstreamer) had ndi support.

Would love to see an open source NDI, but I know newtek will never allow it.


Please check GStreamer NDI source elements in: https://github.com/teltek/gst-plugin-ndi

Offtopic: GStreamer and rust are a powerful combination.


That is actually really sad. I wonder what are the chances of someone reimplementing NDI support as FOSS?


I don’t think it’s just an implementation problem. I think there are patent issues preventing this.

Newtek should really bite the bullet and just open source, and make their money on the hardware.


I don’t think it has anything to do with patents. Anyone can use the library for free. NewTek just doesn’t want to open source the library.


Even though they don’t charge for the library, they have a lot riding on the perception of the quality of their protocol. If they allow third party implementations and some of them suck, it might tarnish NDI’s image (and indirectly hurt them via the money they make on hardware).

Edit: I’m certainly not arguing that any particular implementation does suck, just saying that I can see why they might want to protect IP they don’t make money from directly.


Patents aren’t as much of an issue on software outside the US so it’s theoretically doable legally, it would just be like the situation with mp3 etc, Americans would have to snag the packages hosted from outside the US.


Is there anything in the new release that would allow an encoder to be "motion-aware"?

e.g. if the video is static, don't store any information. But if there is movement in the video, start storing frames etc

WHY? I find myself recording lots of videos of me talking through code in an IDE. The screen mostly static, with some occasional the screen scrolling. The regular tradeoff-space afforded by CRF doesn't seem to get me the size results I believe are possible.


This might be helpful: https://video.stackexchange.com/questions/24680/what-is-keyi...

If you're storing video only for offline viewing with minimal seeking, you can increase the iframe seperation, but if you're streaming this video, you'll need to pay the cost of including iframes to allow clients to seek or recover from dropped packets.


This guy is totally right. When there's no change on screen a huge percentage of bandwidth is from iframes, essentially start over points for fast forward and network corruption.

There's a tradeoff between skip/fast forward fidelity, streaming delay, and iframes. If you're not live streaming and don't care how easy it is to skip around the video increase the iframes inverval as much as you want and watch the bitrate melt away


If you're streaming, you don't need to implement full I-frames; instead you can do a kind of top-to-bottom rolling refresh. The video will be corrupt until the decoder catches up, but that's OK.

This is mostly used for TV broadcasts where you don't want the whole keyframe to get lost because of some brief interference. It's also good because it lowers peak bandwidth per second.


Ah, wonderful. Danke.


Encoders already do this to some extent, but that is the codecs job (AV1, H264 etc) not FFmpegs.


Most modern video codecs (vp9, av1, h264, h265, etc) handle motion-less or motion compression very well with diff between frames. The newer ones handle motion based frames better by shifting the next frame around to find the smallest diff. Ffmpeg just uses whatever codec configured.


There was a submission on HN a while back regarding the complexity of modern codecs. You should read this: https://news.ycombinator.com/item?id=19997813


Increase the key-frame interval


Is there any higher level libraries for JS that wrap FFmpeg commands cleaner?

I'm building some software on using it is kind of cumbersome


I haven't used it, but I believe JIMP might work for you if you're looking for a JS solution to image manipulation

https://github.com/oliver-moran/jimp


For images, you'd want to use a more performant 'sharp'.

https://github.com/lovell/sharp

Benchmark

https://sharp.pixelplumbing.com/en/stable/performance/



I've been working through this over the last year plus in node, and ended up deciding with my team earlier this year to build a library that makes this easier to understand and work with.

It's early yet, and explicit I/O mapping is not quite there at the moment, but you're welcome to check it out. Feedback is welcome.

https://tedconf.github.io/fessonia


A little confused on what they mean by PCM-DVD encoder. Wasn't ffmpeg always able to do this?


PCM-DVD has a specific way in how the channels are interleaved. For bit depths higher than 16, each sample is split so that the lowest byte is stored following the high bytes of all channels. There's also a 3-byte metadata which has to be prefixed to each packet. All of these steps could have been done via a bitstream filter but since the codec_id is different, this has to be done at the encoding stage.


Thanks for the info! Is there any resource online that I can look into to learn more? I'm not certain I know how audio interleaving works.



Nice to see improved HEVC 4:4:4 support in Linux.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: