First some disambiguiation: there is a fork of FFmpeg called Libav. There is also a library system that underlies FFmpeg itself, called libav
. This page is about the library libav
, which is a part of FFmpeg.
FFmpeg itself is composed of several libraries that can be used individually, and outside of FFmpeg, for instance in integrating parts of FFmpeg into your own program. These are:
libavutil
contains various routines used to simplify programming, including random number generators, data structures, mathematics routines, core multimedia utilities, and much more.libavcodec
provides a decoding and encoding API, and all the supported codecs.libavformat
provides a demuxing and muxing API, and all the supported muxers and de-muxers.libavdevice
provides an interface for grabbing from input devices (e.g. webcames or line-in audio) and rendering to output devices, and all the supported input and output deviceslibswscale
provides a scaling and (raw pixel) format conversions API, with high speed/assembly optimized versions of several scaling routines.libavfilter
provides an audio and video filtering API, and all the supported filters.libpostproc
provides video postprocessing routineslibswresample
provides an audio resampling, rematrixing and sample format conversion API, and many high-quality optimized routines.
These can be useful for instance if you don't have access to a command line to run ffmpeg
as an executable, or if you want to use just a small "part" of FFmpeg inside your own program, or if you want access to raw video frames in your program, etc. Also note that if you just need access to raw video frames, you could also write an audio or video filter and compile it along with FFmpeg and distribute that. Another way to access raw video frames is to have ffmpeg output to "stdout", like ffmpeg -i ... -
. Also note that if you just need to convert/transcode videos within your own application, you could make a system call out to the FFmpeg executable to do the heavy lifting for you. You can parse the output for stdout for status information, or use the -progress
option to make the output even more parseable.
Getting Started
Here is the official documentation for using these libraries (the "Libraries Documentation" section).
Also check doc/examples; the doxygen documentation is fairly complete and should work as reference (example: the example codes as doxygen).
In general, you must:
- have the appropriate library compiled/available on your machine (for instance, if using packages, something like
libswscale-dev
must be installed, orconfigure
, build, and install FFmpeg yourself using the--enable-shared
configure option) - include the appropriate header file in your C code
- link against that library's linker file, like
gcc input.c -lswscale
or the like during the linker phase
Community-contributed Tutorials
There are a few tutorials on the web, however, some of them are outdated. The doc/examples files provided by FFmpeg usually use the latest ABI (i.e., they are the best reference on which libav
calls to make) and are therefore more trustworthy.
- An FFmpeg and SDL Tutorial by Stephen Dranger: explains how to write a video player based on FFmpeg
- Learn FFmpeg libav the Hard Way by Leandro Moreira: a work in progress tutorial on using
libav
. - MultimediaWiki list of FFmpeg tutorials
Hints
libavformat
Check its Doxygen documentation. See most of the tutorials, as well.
libavcodec
Check its Doxygen documentation. See most of the tutorials, as well.
Determining the right values to pass to AVCodecContext:
One user shared this advice for determining all the correct values:
[An] approach to figuring this out is:
- come up with the ffmpeg app command line which does what you want
- use the
gdb
debugger to execute theffmpeg_g
app, put a breakpoint onavcodec_encode_audio2()
(or whichever method you need), and see what values the ffmpeg app uses for AVPacket and for the (audio or otherwise) related fields inAVCodecContext
.
libswresample
This file is also given as documentation.
libswscale
This file is also given as documentation.
libavdevice
Check its doxygen documentation.
Here is an example on Opening dshow with avformat_open_input
.
libavfilter
See the MultimediaWiki entry on libavfilter and also the examples, and already existing filters. We have more doxy, some examples and a libavfilter-design document in the documentation.
Contact
If you have problems, one place to get help is to ask the libav-user mailing list, its description: "This list is about using libavcodec, libavformat, libavutil, libavdevice and libavfilter." IRC might work also.