Search code examples
audioffmpeglibavcodeclibavavconv

libav / ffmpeg output optimisation for small file sizes


I am using the following command to take an audio mp3 file and make a video out of it (by using a static jpg picture). My aim is to get a mp3 audio that is as small as possible with still acceptable quality.

frequency="11000"
bitrate="45000"
avconv -loop 1 -i a.jpg -i audio.mp3 -shortest -r 1 -metadata STEREO_MODE=mono -c:v libx264 -ar "$frequency" -b:a "$bitrate" -ac 0 result.mkv

My questions are: 1. how can I achieve that the resulting file is MONO? 2. is it possible to reduce the bitrate furthermore? I would like to use values below 45000, too. 3. My aim is to get control of the parameters that influence the file size most significantly. Presently I know that the frequency is quite important. Are there any other parameters that would help me to get a very small output file with still acceptable quality?

Thanks in advance.


Solution

  • Since you are coding to a compressed audio codec, the frequency doesn't directly affect the file size. However, a frequency of 11 kHz will reduce quality of music.

    Instead, I'd suggest

    frequency="22050"
    bitrate="48000"
    ffmpeg -loop 1 -i a.jpg -i audio.mp3 -shortest -r 1 -c:v libx264 -crf 28 \
           -ar "$frequency" -b:a "$bitrate" -ac 1 result.mkv
    

    The CRF parameter controls video quality - lower values produce better quality but larger files. You'll get more savings from controlling that than audio bitrate, which is at the lower end anyway.

    If your build has libfdk_aac included, you can instead use

    frequency="22050"
    bitrate="32000"
    ffmpeg -loop 1 -i a.jpg -i audio.mp3 -shortest -r 1 -c:v libx264 -crf 28 \
           -ar "$frequency" -c:a libfdk_aac -profile:a aac_he_v2 -b:a "$bitrate" -ac 1 result.mkv