[Libav-user] [Audacity-devel] Requesting help to port Audacity to recent FFmpeg

Benjamin Drung bdrung at debian.org
Tue May 20 23:41:53 CEST 2014

Hi Michael,

first, let me thank you for your work.

Am Dienstag, den 20.05.2014, 19:17 +0200 schrieb Michael Niedermayer:
> Hi
> On Tue, May 20, 2014 at 09:14:33AM +0100, Richard Ash wrote:
> > On Wed, 14 May 2014 19:27:38 +0200
> > Michael Niedermayer <michaelni at gmx.at> wrote:
> > > On Sun, May 11, 2014 at 09:16:29PM +0200, Benjamin Drung wrote:
> > > > That's why I send this mail to this mailing list to request help. Is
> > > > there anyone who has the time and skill to help porting Audacity to
> > > > the latest FFmpeg API version?
> > > > 
> > > > [1] http://bugzilla.audacityteam.org/show_bug.cgi?id=606
> > 
> > I think I'm right in saying that no-one on the audacity-devel list was
> > specifically aware of this work/request (or I might have said something
> > earlier).

I had the spontaneous idea to ask for help on the libav-user mailing
list. I didn't communicated this idea to any audacity developer or
mailing list.

> > As a result of this problem, one of the Audacity contributors, Leyland
> > Lucius, has been perusing the use of Gstreamer as an abstraction layer
> > for ffmpeg. This work has recently arrived in Audacity SVN, so you
> > should be able to see where it is at (it isn't working for me, but I
> > don't think it's Leyland's fault).
> I wasnt aware of that, but still is there no interrest in directly
> supporting FFmpeg ?

The lacking interest in continue supporting FFmpeg was caused by the
missing manpower to keep Audacity updated against the changing API of

I assume that no Audacity will be against having FFmpeg support in the
source code if this support is kept up-to-date. I like to commit your
work to the Audacity SVN so that we have both - support for FFmpeg and

> Also i just fixed planar export & put the disabled options back so
> my github should contain a audacity that fully works with latest
> ffmpeg, of course there will be bugs but iam happy to fix them if
> they get reported to me ...

I tested your patches with FFmpeg 2.2.1-2 on Ubuntu 14.04 with the
--disable-dynamic-loading configure flag. To succeed compiling, I had to
apply the attached 0001*.patch.

Then I modified the code and successfully compiled Audacity against the
libav version from Ubuntu 14.04. For that I had to create the second
0002*.patch (there you have to use --disable-dynamic-loading)

Importing and exporting ac3 and wma works with both libraries (including
setting the audio quality).

I found some issues:

1) There was a debugging line left in the code: fprintf(stderr, "READ %d
ret %d\n", size, ret);

2) I can't export audio as mp4. Neither as mp4 export, nor as custom
FFmpeg export (can't be selected there). FFmpeg has mp4 support enabled:

$ ffmpeg -formats 2>/dev/null | grep mp4
 D  mov,mp4,m4a,3gp,3g2,mj2 QuickTime / MOV
  E mp4             MP4 (MPEG-4 Part 14)

> >
> > The rationale for doing this is that the Gstreamer 1.0 API is much more
> > stable than the libAV one, and there is an (actively maintained)
> > gst-plugin-libav which provides the functionality of libAV through that
> > API. Thus the problem of providing up-to-date builds of libAV is
> > reduced, and an abstraction layer is provided.
> Iam quite aware of the API stability issues in our API.
> Its a result of FFmpeg supporting all features and bugfixes as well
> as to be API compatible to the fork (libav) and that changing the API
> all the time.
> One question here would be if there would be interrest if FFmpeg would
> provide a seperate simple API which isnt designed to be as efficient
> as possible and which makes no attempt to be compatible with libav.
> such API could then be long term stable
> ?
> This idea did come up already a few times IIRC. Just noone imlpemented
> it yet, but the more people support the idea the more likely someone
> will sit down and write it ...

IMO it would make sense to have a subset of the API (it doesn't have to
be a separate API) where you promise long term stability.

> > This also has the benefit of allowing (in principal) any other codecs
> > which are supported in Gstreamer (or by plugins for it) to be added to
> > Audacity relatively easily. This is something we hope to make modular,
> > so that it doesn't need a complete new build of audacity to use new
> > gstreamer plug-ins, and every download of Audacity doesn't have to ship
> > with every possible codec library.

Are there really codecs that are supported by Gstreamer, but not by

> hmm, i dont know exactly which codecs gstreamer supports but ffmpeg
> also supports quite a few external libs as codecs, the ones ive enabled
> on my local build:
> decoders:
>  A....D libfdk_aac           Fraunhofer FDK AAC (codec aac)
>  A....D libopencore_amrnb    OpenCORE AMR-NB (Adaptive Multi-Rate Narrow-Band) (codec amr_nb)
>  A....D libopencore_amrwb    OpenCORE AMR-WB (Adaptive Multi-Rate Wide-Band) (codec amr_wb)
>  A....D libgsm               libgsm GSM (codec gsm)
>  A....D libgsm_ms            libgsm GSM Microsoft variant (codec gsm_ms)
>  A....D libilbc              iLBC (Internet Low Bitrate Codec) (codec ilbc)
>  A....D libopus              libopus Opus (codec opus)
>  A....D libspeex             libspeex Speex (codec speex)
>  A..... libvorbis            libvorbis (codec vorbis)
> encoders:
>  A..... libfaac              libfaac AAC (Advanced Audio Coding) (codec aac)
>  A..... libfdk_aac           Fraunhofer FDK AAC (codec aac)
>  A..... libvo_aacenc         Android VisualOn AAC (Advanced Audio Coding) (codec aac)
>  A..... libaacplus           libaacplus AAC+ (Advanced Audio Codec with SBR+PS) (codec aac)
>  A..... libopencore_amrnb    OpenCORE AMR-NB (Adaptive Multi-Rate Narrow-Band) (codec amr_nb)
>  A..... libvo_amrwbenc       Android VisualOn AMR-WB (Adaptive Multi-Rate Wide-Band) (codec amr_wb)
>  A..... libgsm               libgsm GSM (codec gsm)
>  A..... libgsm_ms            libgsm GSM Microsoft variant (codec gsm_ms)
>  A..... libilbc              iLBC (Internet Low Bitrate Codec) (codec ilbc)
>  A..... libmp3lame           libmp3lame MP3 (MPEG audio layer 3) (codec mp3)
>  A..... libopus              libopus Opus (codec opus)
>  A..... libspeex             libspeex Speex (codec speex)
>  A..... libvorbis            libvorbis (codec vorbis)
> changing these would generally require a rebuild of libavcodec though
> but not audacity.
> Also if someone wants to change ffmpegs external lib support to use
> dlopen for some or all cases, i surely wouldnt mind ...
> Also according to:
> ./ffmpeg -filters | egrep '\->A|A\-' | wc
> there are 58 audio filters in ffmpegs libavfilter (not counting ones
> that arent enabled in my local build)
> So maybe libavfilter support might be interresting to audacity too ?
> And the codecs in ffmpeg support quite a few more options than what
> is available to be set from audacity currently. It should be fairly
> easy to add generic option support for someone who knows the
> audacity API.
> random example:
> ./ffmpeg -help encoder=libopus
> ...
> Encoder libopus [libopus Opus]:
>     Threading capabilities: no
>     Supported sample rates: 48000 24000 16000 12000 8000
>     Supported sample formats: s16 flt
>     Supported channel layouts: mono stereo 3.0 quad 5.0 5.1 6.1 7.1
> libopus AVOptions:
>   -application       <int>        E...A... Intended application type (from 2048 to 2051) (default 2049)
>      voip                         E...A... Favor improved speech intelligibility
>      audio                        E...A... Favor faithfulness to the input
>      lowdelay                     E...A... Restrict to only the lowest delay modes
>   -frame_duration    <float>      E...A... Duration of a frame in milliseconds (from 2.5 to 60) (default 20)
>   -packet_loss       <int>        E...A... Expected packet loss percentage (from 0 to 100) (default 0)
>   -vbr               <int>        E...A... Variable bit rate mode (from 0 to 2) (default 1)
>      off                          E...A... Use constant bit rate
>      on                           E...A... Use variable bit rate
>      constrained                  E...A... Use constrained VBR
> Thanks

Benjamin Drung
Debian & Ubuntu Developer
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-Prefer-newer-av_get_bits_per_sample_fmt-over-av_get_.patch
Type: text/x-patch
Size: 1325 bytes
Desc: not available
URL: <https://ffmpeg.org/pipermail/libav-user/attachments/20140520/6f690cde/attachment.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0002-Add-support-for-libav-9.patch
Type: text/x-patch
Size: 5630 bytes
Desc: not available
URL: <https://ffmpeg.org/pipermail/libav-user/attachments/20140520/6f690cde/attachment-0001.bin>

More information about the Libav-user mailing list