LGPL in Practice: The FFmpeg DLLs Inside Proprietary Products
LGPL obligations made concrete: license texts, replaceable dynamic linking, source for the LGPL parts — and the FFmpeg DLLs vendors bundle.
For Technical Teams

On this page
LGPL permits libraries to be used in proprietary software under specific conditions. Dynamic linking can support component replacement, but it does not remove obligations to provide license texts and matching source. Check the applicable license version and the way the product is distributed.
FFmpeg is commonly bundled in commercial products, so it is a useful worked example. (Standard note: engineering guidance, not legal advice.)
The three obligations, concretely
When shipping an LGPL library inside a proprietary product, check these three obligations under the applicable version:
- Ship the license text. The LGPL text, plus the copyright notices,
travels with the product — an installer folder, an about screen, a
licenses/directory. Trivial, and still the most commonly skipped step. - Keep the component replaceable. The user must be able to swap the LGPL
library for their own build. Dynamic linking is the classic mechanism: if
avcodec-61.dllsits next to your executable, a user can rebuild FFmpeg and drop their DLL in. Static linking can also comply, but requires a relinking route, such as object files and materials that let users rebuild with a modified library, under the applicable LGPL version. - Provide source for the LGPL parts. Not your application — the LGPL library itself, including any modifications you made to it. The method must match the license version and distribution route. The official FFmpeg checklist calls for the exact matching source, changes, and build instructions. A link to a generic upstream page is not evidence of compliance.
Also check your end-user terms: the FFmpeg checklist requires removing restrictions on reverse engineering. The applicable LGPL version defines the rights needed for modification and debugging.
LGPL can permit your application to remain closed when its conditions are met. That's the entire point of the license — and why the boundary rules above are worth getting exactly right.
The DLLs sitting next to closed binaries
Install a proprietary access-control suite, a CCTV video management system,
or a kiosk platform and look inside the program folder. You'll very often
find avcodec.dll, avformat.dll, avutil.dll, swscale.dll (FFmpeg)
sitting next to fully closed executables. That arrangement can comply when all applicable license conditions are met; the three checks above are a starting point. In practice, the license text is
frequently missing, and asking the vendor for the corresponding FFmpeg
source produces silence.
One subtlety multiplies the risk: FFmpeg's license depends on how it was
built. A default build is LGPL; configure it with --enable-gpl (for x264
and friends) and the whole build becomes GPL — a different license with
obligations no proprietary product can meet by shipping a DLL. Nonfree flags
make the build undistributable entirely.
So "which FFmpeg build did the vendor ship?" isn't pedantry. It decides which license you're actually subject to.
The MIT wrapper illusion
The npm ecosystem adds a modern trap. A package can be MIT-licensed, look spotless in every license scanner, and be nothing but a thin binding over an LGPL native library. The libgphoto2-style camera control wrappers are a classic of the genre, and the FFmpeg wrapper packages behave identically. The wrapper's MIT license covers the JavaScript glue and nothing else.
The native library retains its LGPL license. Your obligations depend on how the product links to it and whether you distribute the library or a combined work. Scanners that read package.json files can't see
this — the check that works is looking at what the process actually loads at
runtime, the .so and .dll files, not the manifests. I've covered where
this fits among the other license traps in
open-source licenses in commercial software.
The vendor's gaps become your gaps
Here's the part that turns an abstract compliance question into a commercial one. When you bundle a vendor SDK in your deliverable, you are redistributing the components you include — including the LGPL binaries the vendor bundled and whatever obligations they left unmet.
A due-diligence review of your product will find their missing license texts, and "the vendor shipped it that way" is not a defense available to you. You're the distributor now. The time to fix this is contract time: compliance statements and redistribution rights in the supply agreement, before the SDK is welded into your architecture.
The integrator's checklist
Before any delivery that bundles native code, mine runs like this: inventory
every .dll and .so in the package, including the ones a vendor SDK
dragged in. Identify each one's actual license, which for FFmpeg means
identifying the build configuration. Verify the three obligations for
everything LGPL, then put the vendor's compliance in writing where it's
missing.
A review before delivery helps avoid costly architecture changes after a licensing problem is found. Keep the compliance evidence complete. Other license risks are discussed in AGPL and commercial computer vision.
What should you request from the vendor?
Ask for component versions, FFmpeg configuration, license texts, and the route to matching source. The vendor should also demonstrate replacement of the LGPL parts under the chosen mechanism. Keep that evidence with the handover package.
Related Posts
Need help applying this approach?
System Architecture Consulting
Map requirements, integrations, and risks before building or expanding a system. Get design options and priorities to discuss with your team.
Explore related servicesDescribe the operational problem you are facing so we can discuss a suitable next step.