62

The Opus audio codec looks like the best codec so far for compressing audio. It has recently become supported in the latest ffmpeg and VLC players. However, there is no documentation I can find on how to actually encode media with it. Can someone please direct me to said docs, preferably with specifics to ffmpeg flags and usage? I have a lot of audiobooks that are taking up far too much space and Opus looks to be the perfect format to keep them in.

1
  • 4
    You did not mention your OS.
    – llogan
    Dec 9, 2012 at 17:48

3 Answers 3

78
ffmpeg -i <input> -c:a libopus -b:a bitrate <output>

The bitrate can be given like -b:a 96K for 96 kBit/s.

The ffmpeg documentation has a list of options and descriptions for libopus. Here you can set -vbr options or a different -compression_level.

Make sure you compiled ffmpeg with --enable-libopus!

9
  • 1
    This is great! I had figured out how to encode with ffmpeg, but didn't know about the -vbr and --compression_level flags. This is exactly what I was looking for!
    – MrDrMcCoy
    Dec 5, 2013 at 20:36
  • 13
    This helped me. NB, vbr on and compression_level 10 are defaults and can probably be omitted. ffmpeg.org/ffmpeg-codecs.html#Option-Mapping Oct 24, 2017 at 18:12
  • 4
    Indeed, these are the default values, and in most cases they don't have to be modified. Also, note the bitrate is in bits/s, not the usual kbits/s. The default bitrate is 96000 (96 kbits/s), which is (of course arguably) a fine value. Sample command to summarize: ffmpeg -i input.flac -acodec libopus -b:a 128000 output.opus Aug 18, 2018 at 15:14
  • 1
    Here is how to use the 'application' parameter -application voip . As a new ffmpeg user I struggled a bit to find the right syntax.
    – tuxayo
    Apr 26, 2019 at 20:16
  • 2
    @MinhNghĩa en.wikipedia.org/wiki/Variable_bitrate what you describe with q is fixed quality mode. I was describing average bitrate which I presume libopus is using here. They are both forms of vbr.Obviously in this answer we are not defining a q value, so it cannot be using fixed quality mode. I don't even see that libopus can operate in a fixed quality mode at all at ffmpeg.org/ffmpeg-codecs.html#libopus-1 . You must be thinking of a different codec.
    – localhost
    Mar 17, 2021 at 22:16
16
  1. Download Opus-tools

  2. Encode:
    opusenc --bitrate 64 What_A_Feeling.wav What_A_Feeling_64.opus

  3. Decode: (to play in any media player, useful if your media player does not support opus yet):
    opusdec What_A_Feeling_64.opus What_A_Feeling_opus64.wav

(What_A_Feeling is a song name)

Detailed options displayed when running opusenc by itself:

Usage: opusenc [options] input_file output_file.opus

Encodes input_file using Opus.
It can read the WAV, AIFF, FLAC, Ogg/FLAC, or raw files.

General options:
 -h, --help         This help
 -V, --version      Version information
 --quiet            Quiet mode

input_file can be:
  filename.wav      file
  -                 stdin

output_file can be:
  filename.opus     compressed file
  -                 stdout

Encoding options:
 --bitrate n.nnn    Target bitrate in kbit/sec (6-256/channel)
 --vbr              Use variable bitrate encoding (default)
 --cvbr             Use constrained variable bitrate encoding
 --hard-cbr         Use hard constant bitrate encoding
 --comp n           Encoding complexity (0-10, default: 10 (slowest))
 --framesize n      Maximum frame size in milliseconds
                      (2.5, 5, 10, 20, 40, 60, default: 20)
 --expect-loss      Percentage packet loss to expect (default: 0)
 --downmix-mono     Downmix to mono
 --downmix-stereo   Downmix to stereo (if >2 channels)
 --max-delay n      Maximum container delay in milliseconds
                      (0-1000, default: 1000)

Diagnostic options:
 --serial n         Forces a specific stream serial number
 --save-range file  Saves check values for every frame to a file
 --set-ctl-int x=y  Pass the encoder control x with value y (advanced)
                      Preface with s: to direct the ctl to multistream s
                      This may be used multiple times

Metadata options:
 --comment          Add the given string as an extra comment
                      This may be used multiple times
 --artist           Author of this track
 --title            Title for this track
 --album            Album or collection this track belongs to
 --date             Date for this track
 --genre            Genre for this track
 --picture          Album art for this track
                      More than one --picture option can be specified.
                      Either a FILENAME for the picture file or a more
                      complete SPECIFICATION form can be used. The
                      SPECIFICATION is a string whose parts are
                      separated by | (pipe) characters. Some parts may
                      be left empty to invoke default values. A
                      FILENAME is just shorthand for "||||FILENAME".
                      The format of SPECIFICATION is

                      [TYPE]|[MIME-TYPE]|[DESCRIPTION]|[WIDTHxHEIGHT
                      xDEPTH[/COLORS]]|FILENAME

                      TYPE is an optional number from one of:
                      0: Other
                      1: 32x32 pixel 'file icon' (PNG only)
                      2: Other file icon
                      3: Cover (front)
                      4: Cover (back)
                      5: Leaflet page
                      6: Media (e.g., label side of a CD)
                      7: Lead artist/lead performer/soloist
                      8: Artist/performer
                      9: Conductor
                      10: Band/Orchestra
                      11: Composer
                      12: Lyricist/text writer
                      13: Recording location
                      14: During recording
                      15: During performance
                      16: Movie/video screen capture
                      17: A bright colored fish
                      18: Illustration
                      19: Band/artist logotype
                      20: Publisher/studio logotype

                      The default is 3 (front cover). There may only be
                      one picture each of type 1 and 2 in a file.

                      MIME-TYPE is optional. If left blank, it will be
                      detected from the file. For best compatibility
                      with players, use pictures with a MIME-TYPE of
                      image/jpeg or image/png. The MIME-TYPE can also
                      be --> to mean that FILENAME is actually a URL to
                      an image, though this use is discouraged. The
                      file at the URL will not be fetched. The URL
                      itself is stored in the metadata.

                      DESCRIPTION is optional. The default is an empty
                      string.

                      The next part specifies the resolution and color
                      information. If the MIME-TYPE is image/jpeg,
                      image/png, or image/gif, you can usually leave
                      this empty and they can be detected from the
                      file. Otherwise, you must specify the width in
                      pixels, height in pixels, and color depth in
                      bits-per-pixel. If the image has indexed colors
                      you should also specify the number of colors
                      used. If possible, these are checked against the
                      file for accuracy.

                      FILENAME is the path to the picture file to be
                      imported, or the URL if the MIME-TYPE is -->.
 --padding n        Extra bytes to reserve for metadata (default: 512)
 --discard-comments Don't keep metadata when transcoding
 --discard-pictures Don't keep pictures when transcoding

Input options:
 --raw              Raw input
 --raw-bits n       Set bits/sample for raw input (default: 16)
 --raw-rate n       Set sampling rate for raw input (default: 48000)
 --raw-chan n       Set number of channels for raw input (default: 2)
 --raw-endianness n 1 for bigendian, 0 for little (defaults to 0)
 --ignorelength     Always ignore the datalength in Wave headers
3
  • 1
    Thanks, but I was hoping for something a bit more detailed. Are there variable bit rate options? What other flags can I pass to optimize the audio stream?
    – MrDrMcCoy
    Dec 9, 2012 at 21:56
  • 2
    @nakedhitman The --vbr option is default. See the man page for opusenc. You can also encode with ffmpeg but it needs to be compiled with --enable-libopus after installing libopus.
    – llogan
    Dec 9, 2012 at 23:10
  • For getting an idea (not for batch conversion), an online version like this might be helpful. In case one's plan is to convert an entire collection, opusinfo (also part of opus-tools) might tell, whether the chosen encoding tool performed well. Sep 16, 2017 at 23:11
3

The best Opus Codec commands in DOS/Windows Command would be:

For lib 1.3, smallest filesize (tape quality):

Opusenc a.wav a.opus --bitrate 24 --framesize 40 --discard-comments --discard-pictures

You will:

a- at 24kbits still have a 16kHz (32kHz stereo) sonic output, on a super small size. Any smaller, and Sonic output will drop to 11kHz

b- Increase framesize (save a few bits of data (about 6%), without perceivable loss in quality)

c- Discard unnecessary TAG info, and cover pictures that will only enlarge file size.

For lib 1.3, streaming (near CD quality) use '--bitrate 52' instead of '24'.

The default in 1.2 is 48kbits, but using 52 in 1.3, with 'framesize' set to 40, your file size is equal, but there are much less artifacts audible.

52 kbits with framesize 40, is arguably equal in quality to 160kbits MP3, at less than 1/3rd the size; while 48kbits on 1.2 equals 128kbits MP3, or only 2.5x smaller in size.

For near identical quality, you'll need between 80 to 96kbits. I hardly ever use this, as I want my audio as small as possible.

Over 96kbits, is only good for editing, and one can't audibly hear the difference between the original and the Opus encoded file.

That being said, I don't yet know how it all works in Linux.

2
  • I got an error trying that one on both linux and windows: Unrecognized option '-framesize'. Error splitting the argument list: Option not found. ffmpeg version is 4.0.2
    – sukhmel
    Feb 20, 2019 at 8:55
  • @sukhmel instead of -framesize try this: -frame_duration 40
    – RocketNuts
    Aug 11, 2022 at 11:37

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .