Збірка ffmpeg з підтримкою AAC+ засобами FDK AAC


В рамках сетапу ретрансляції радіо "Культура" на радіо Pidpilne, був приємно здивований високою якістю звуку AAC+ при низьких бітрейтах (до 16) і вирішив поряд з онлайн-ретрансляціями ще й додати у цьому форматі дампи деяких подкастів з Youtube.


Але виявилось, що просто перекодувати потік з yt-dlp засобами ffmpeg з репозиторіїв Fedora не вийде, через ліцензійні обмеження GNU/GPL. Довелось зібрати ffmpeg з сорсу - код потрібних кодеків є відкритим, хоч і не вільним для поширення:


License: nonfree and unredistributable


Системні залежності


sudo dnf remove ffmpeg
sudo dnf install fdk-aac-devel \
                 freetype-devel \
                 lame-devel \
                 libass-devel \
                 libvorbis-devel \
                 libvpx-devel \
                 openssl-devel \
                 opus-devel \
                 SDL2-devel \
                 x264-devel \
                 x265-devel

Якщо потрібних пакетів не знайдено:


sudo dnf install https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm

Переконайтесь, що бібліотека `fdk-aac` розпізнається системою:


$ pkg-config --modversion fdk-aac
2.0.3

fdk-aac


В мене варіант з сорсу не спрацював (ймовірно) через не правильну лінковку, тому згодом я встановив `fdk-aac-devel`, а даний приклад компіляції - просто лишаю для нотатки як є, може згодиться потім.


Опціонально, останню версію fdk-aac можна зібрати з початкового коду:


git clone https://github.com/mstorsjo/fdk-aac.git
cd fdk-aac
./autogen.sh
./configure
make -j$(nproc)
sudo make install

ffmpeg


git clone https://github.com/FFmpeg/FFmpeg.git
cd FFmpeg
./configure --enable-gpl \
            --enable-libass \
            --enable-libfdk-aac \
            --enable-libfreetype \
            --enable-libmp3lame \
            --enable-libopus \
            --enable-libvorbis \
            --enable-libvpx \
            --enable-libx264 \
            --enable-libx265 \
            --enable-nonfree \
            --enable-openssl
make -j$(nproc)
sudo make install

Якщо для роботи із зовнішніми програмами (yt-dlp, firefox) збірка виконується з конфігурацією `--enable-shared`, на Fedora додатково:


echo "/usr/local/lib" | sudo tee /etc/ld.so.conf.d/ffmpeg-local.conf
/usr/local/lib
sudo ldconfig

Тестування


$ ffmpeg -encoders | grep fdk
A....D libfdk_aac           Fraunhofer FDK AAC (codec aac)

$ ffmpeg -hide_banner -h encoder=libfdk_aac
Encoder libfdk_aac [Fraunhofer FDK AAC]:
    General capabilities: dr1 delay small
    Threading capabilities: none
    Supported sample rates: 96000 88200 64000 48000 44100 32000 24000 22050 16000 12000 11025 8000
    Supported sample formats: s16
    Supported channel layouts: mono stereo 3.0 4.0 5.0 5.1 6.1(back) 7.1(wide) 7.1 5.1.2(back)
...

Перекодування


Нижче - мої приклади з низькими бітрейтами та максимальною компактністю для "голосу".


Моно (HE-AAC v1)


ffmpeg -i input.wav -c:a libfdk_aac -profile:a aac_he -b:a 16k -ar 22050 output.m4a

Стерео (HE-AAC v2)


ffmpeg -i input.wav -c:a libfdk_aac -profile:a aac_he_v2 -b:a 32k -ar 22050 output.m4a

Перевірка


На прикладі результату для "Стерео (HE-AAC v2)":


$ ffprobe output.m4a
...
Audio: aac (HE-AACv2) (mp4a / 0x6134706D), 22050 Hz, stereo, fltp, 32 kb/s (default)
...

yt-dlp


Довідка: на "вході" та "виході" використовується контейнер .m4a - він потрібен для збереження мета-інформації про відео:


yt-dlp -x --audio-format m4a \
          --postprocessor-args "ffmpeg: -c:a libfdk_aac -profile:a aac_he_v2 -b:a 32k -ar 22050" \
          URL

Згодом, відмовився від варіанту вище, бо `yt-dlp` напихає своїх прихованих аргументів, через що при якості 16k звіт `ffprobe` показує ~50к. Розбиратись мені з цим стало не цікаво, тому замінив `--postprocessor-args` на `--exec` - це працює надійніше "інтеграцій" бо пускається окремим кроком, після отримання оригіналу:


yt-dlp -x -o "%(title)s [%(id)s].%(ext)s" \
       --exec 'f={}; ffmpeg -i "$f" -c:a libfdk_aac -profile:a aac_he -b:a 16k -ar 16000 -ac 1 "${f%.*}.m4a" && rm "$f"' \
       URL

Firefox


Тут в мене своя запара на базі допотопного ESR 115. Поки не вирішив але напрямок такий:


$ LD_DEBUG=libs MOZ_LOG="FFmpeg:5" firefox

Це поки не допомогло:



https://linux.org.ua/index.php?topic=12377.0


Посилання


https://trac.ffmpeg.org/wiki/Encode/AAC#fdk_aac


Дивіться також


Підпільне: ретрансляція українського мовлення



/uk/