Search code examples
audioffmpegaacopus

How to convert aac to ogg opus keeping bit rate and sample rate unchanged


I'm trying to convert a .aac file to .opus but after inspecting with ffprobe I get different bit and sample rates.

While input file's audio stream bit rate is 245995, the output file's audio stream has no bit rate specified - "format" shows bit rate of 118788.

While input file's audio stream sample rate is 44100, the output's is 48000.

ffprobe  -v error -show_format -show_streams input.aac
[STREAM]
index=0
codec_name=aac
codec_long_name=AAC (Advanced Audio Coding)
profile=LC
codec_type=audio
codec_time_base=1/44100
codec_tag_string=[0][0][0][0]
codec_tag=0x0000
sample_fmt=fltp
sample_rate=44100
channels=2
channel_layout=stereo
bits_per_sample=0
id=N/A
r_frame_rate=0/0
avg_frame_rate=0/0
time_base=1/28224000
start_pts=N/A
start_time=N/A
duration_ts=106533390807
duration=3774.567418
bit_rate=245995
max_bit_rate=N/A
bits_per_raw_sample=N/A
nb_frames=N/A
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=0
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
DISPOSITION:timed_thumbnails=0
[/STREAM]
[FORMAT]
filename=input.aac
nb_streams=1
nb_programs=0
format_name=aac
format_long_name=raw ADTS AAC (Advanced Audio Coding)
start_time=N/A
duration=3774.567418
size=116065589
bit_rate=245995
probe_score=51
[/FORMAT]
ffmpeg -nostdin -i input.aac -c:a libopus output.opus
ffmpeg version N-93449-g013f714 Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 7 (Ubuntu 7.3.0-27ubuntu1~18.04)
  configuration: --prefix=/home/vagrant/ffmpeg_build --pkg-config-flags=--static --extra-cflags=-I/home/vagrant/ffmpeg_build/include --extra-ldflags=-L/home/vagrant/ffmpeg_build/lib --extra-libs='-lpthread -lm' --bindir=/home/vagrant/bin --enable-gpl --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-nonfree
  libavutil      56. 26.100 / 56. 26.100
  libavcodec     58. 47.105 / 58. 47.105
  libavformat    58. 26.101 / 58. 26.101
  libavdevice    58.  7.100 / 58.  7.100
  libavfilter     7. 48.100 /  7. 48.100
  libswscale      5.  4.100 /  5.  4.100
  libswresample   3.  4.100 /  3.  4.100
  libpostproc    55.  4.100 / 55.  4.100
[aac @ 0x55d4b7e21d80] Estimating duration from bitrate, this may be inaccurate
Input #0, aac, from 'input.aac':
  Duration: 01:02:54.57, bitrate: 245 kb/s
    Stream #0:0: Audio: aac (LC), 44100 Hz, stereo, fltp, 245 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (aac (native) -> opus (libopus))
[libopus @ 0x55d4b7e3f8c0] No bit rate set. Defaulting to 96000 bps.
Output #0, opus, to 'output.opus':
  Metadata:
    encoder         : Lavf58.26.101
    Stream #0:0: Audio: opus (libopus), 48000 Hz, stereo, flt, 96 kb/s
    Metadata:
      encoder         : Lavc58.47.105 libopus
size=   52103kB time=00:59:53.21 bitrate= 118.8kbits/s speed=66.2x
video:0kB audio:51733kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.715930%
ffprobe -v error -show_format -show_streams output.opus
[STREAM]
index=0
codec_name=opus
codec_long_name=Opus (Opus Interactive Audio Codec)
profile=unknown
codec_type=audio
codec_time_base=1/48000
codec_tag_string=[0][0][0][0]
codec_tag=0x0000
sample_fmt=fltp
sample_rate=48000
channels=2
channel_layout=stereo
bits_per_sample=0
id=N/A
r_frame_rate=0/0
avg_frame_rate=0/0
time_base=1/48000
start_pts=0
start_time=0.000000
duration_ts=172473677
duration=3593.201604
bit_rate=N/A
max_bit_rate=N/A
bits_per_raw_sample=N/A
nb_frames=N/A
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=0
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
DISPOSITION:timed_thumbnails=0
TAG:ENCODER=Lavc58.47.105 libopus
[/STREAM]
[FORMAT]
filename=output.opus
nb_streams=1
nb_programs=0
format_name=ogg
format_long_name=Ogg
start_time=0.000000
duration=3593.201604
size=53353867
bit_rate=118788
probe_score=100
[/FORMAT]

How can I preserve the quality of the input file? Am I missing something in the ffmpeg cmd?


Solution

  • There is no sample rate of 44100 with Opus, so in this case you have to resample.

    The available sampling rates for Opus are 8, 12, 16, 24, or 48 kHz (according to the RFC6716 section Resampling).

    There might be no matching bitrate either. Then you are anyway re-encoding and hence quality loss. And finally an attempt to match bitrates does not imply that the data is of equal encoding quality, even though certain correlation exists.