Всем привет!
Решил поделиться опытом автоматизации контроля громкости вещания своего СМИ. Думаю, у всех профильных технарей давно болит голова, точно продолжает болеть. Введенная Минкомсвязи рекомендация в области нормирования громкости звуковых сигналов вызвала волны возмущения.
Не было предоставлено ни средств контроля, ни средств производства. Крутитесь как хотите.
Впрочем, уже давно, задолго до того знакового события существуют различные плагины к монтажным программам.
Но как быть если уже накоплена огроменная медиабаза?
image

Побродил я по просторам интернета и наткнулся на очень, по моему мнению, элегантное решение. Причем, к радости моей, это оказалось свободное ПО. Проект называется r128gain.

r128gain измеряет громкость аудио файлов в единицах измерения LUFS. Понимает она, насколько я выяснил, два формата:

  • FLAC
  • PCM signed 16 bit little endian (Microsoft WAVE)

После измерения предлагается применить громкость к дорожке двумя способами:

1. Используя утилиту SoX — Sound eXchange, получить причесанный звук:

r128gain "--command=sox %TRACK% out.wav|flac gain %TGDB%" in.wav|flac -o .

2. Используя утилиту FFmpeg заменить/добавить аудиодорожку к фидеофайлу:

r128gain "--command=ffmpeg -i %TRACK% -vcodec copy -acodec flac -af volume=%TG% -y out.mkv" in.wav|flac -o.

Я выбрал первый вариант. Чтобы выделить звук из моих видеофайлов, я использую ffmpeg:

ffmpeg -i in.avi -vn -c:a pcm_s16le -ac 2 in.wav -y

Нормализация:

r128gain "--command=sox %TRACK% out.wav|flac gain %TGDB%" in.wav|flac -o .

Сборка готового видео файла. Так как кроме старых файлов имеется постоянный поток сторонних, приводим к единому формату. У меня используется такой стандарт:

video: MPEG2 PAL 720x576
audio: MPEG1 Layer II

Сборка:

ffmpeg -i in.avi -i out.wav -c:v mpeg2video -b 30000k -s pal -r pal -aspect 4:3 -vf scale=min(576*15*sar*iw/ih/16\,720):min(720*16*ih/15/sar/iw\,576),pad=720:576:(ow-iw)/2:(oh-ih)/2 -flags +ilme+ildct -movflags faststart -c:a mp2 -map 0:v:0 -map 1:a:0 out.mpg -y

На выходе получаем продукт в едином формате.

Спасибо за помощь arteastarteast

Спасибо за внимание! Надеюсь, моя статья окажется для вас полезной.
Поделиться с друзьями
-->

Комментарии (11)


  1. Durimar123
    05.10.2016 12:17

    >r128gain измеряет громкость аудио файлов

    Громкость файла это не цифра, а стрим, что именно это программа дает на выходе?


    1. AntonCheloshkin
      05.10.2016 13:53

      громкость в единицах измерения LUFS


  1. Xalium
    05.10.2016 13:54

    прога просто анализирует весь файл, потом запускает соответствующие утилиты (sox/ffmpeg) с нужными параметрами без всяких стримов.


  1. arteast
    05.10.2016 17:37

    Можно было обойтись только ffmpeg:
    1) использовать аудиофильтр ebur128, чтобы замерить громкость
    2) вторым проходом использовать аудиофильтр volume, чтобы изменить громкость. Заодно выбросить информацию о replaygain, если она есть

    Плюс этого подхода в том, что не нужны лишние программы, и более корректно будут кодироваться немножко битые файлы (у которых аудио и видео начинаются не одновременно).

    Еще есть аудиофильтр loudnorm, который за один проход динамически подстраивает громкость до заданного результата.

    Опция -aspect случаем не корежит файлы, которые изначально были с неквадратным пикселом (PAR != 1/1)? Есть подозрение, что будет корежить.

    Стандарты — это хорошо, но использовать в 2016 году mpeg2 (с битрейтом 30Мб/с для SD видео!) и mp2 — это как-то… нестандартно.


    1. AntonCheloshkin
      05.10.2016 17:56

      да, мне представляется избыточным выражение


      -s pal -r pal -aspect 4:3 -vf scale=720:-1,pad=720:576:(ow-iw)/2:(oh-ih)/2

      корежение предотвращается выражением


      -vf scale=720:-1,pad=720:576:(ow-iw)/2:(oh-ih)/2

      Спасибо за подсказки с фильтрами, попробую.


      проект r128gain больше не развивается, думаю переходить на bs1770gain от того же автора, который в данный момент является бетой, судя по latest версии.
      Резонность использования утилиты r128gain мне представляется по главной причине: эта утилита специализирована именно для измерения и только для измерения громкости по методике R128-2011, которая нормирована нашим регулятором.
      r128gain проверена и используется профессиональными студиями.
      r128gain проверена мной и результат меня устраивает, а главное — устраивает регулятора.


      по поводу стандартов — разрешите не обсуждать.
      Спасибо за комментарий.


      1. arteast
        05.10.2016 18:53

        И все-таки корежит. Проверить просто — берем любой нормальный файл и конвертируем его в пару тестовых файлов. Один раз используя -s 720x288, один раз используя -s 360x576. Получаем два файла с дикими значениями SAR, но тем же DAR, что был в исходном файле. Любой нормальный плеер их отыграет с нормальной картинкой. А после перегона вашей комбинацией фильтров — получится жестокое искажение. Это потому, что ваша комбинация фильтров просто-напросто игнорирует исходное значение SAR/DAR, считая, что исходный SAR был 16:15. Более правильно так: -aspect 4:3 -vf «scale=min(576*15*sar*iw/ih/16\,720):min(720*16*ih/15/sar/iw\,576),pad=720:576:(ow-iw)/2:(oh-ih)/2». Здесь scale приводит SAR к 16:15 и одновременно вписывает картинку в 720x576.

        Что касается стандартов, то и r128gain, и af=ebur128 (своя внутренняя реализация) и af=loudnorm (использует libebur128) реализуют стандарт R128; возможно, более старую ревизию, чем 11 года… Но если учитываются требования регулятора, то это серьезный довод в пользу именно вашего решения по измерению.


        1. AntonCheloshkin
          06.10.2016 11:07

          Кармы моей на Вас не хватает!
          Вы внесли большой вклад.


          Оформим для читателей.


          -aspect 4:3 -vf "scale=min(576*15*sar*iw/ih/16\,720):min(720*16*ih/15/sar/iw\,576),pad=720:576:(ow-iw)/2:(oh-ih)/2"

          Спасибо!


        1. AntonCheloshkin
          06.10.2016 11:18

          а, или отталкиваться от количества строк, что, возможно, более правильно и сильно короче и понятнее.


          -aspect 4:3 -vf scale=-1:576,pad=720:576:(ow-iw)/2:(oh-ih)/2

          В статью пока внес правки из Вашего комментария.


          1. arteast
            06.10.2016 11:33

            А разница? Такой вариант тоже искажает картинку. Для большинства входного контента SAR либо 16:15, либо 1:1, так что искажение обычно малозаметно на глаз; но если попадется какой-нибудь нестандартный контент, то будут проблемы


    1. AntonCheloshkin
      05.10.2016 18:04

      30Мб/с — предельный битрейт. Фактически на выходе он не превышает в среднем 6Мб/с


    1. AntonCheloshkin
      06.10.2016 13:08

      Еще замечание по аудио фильтрам


      • af=ebur128
      • af=loudnorm

      Эти фильтры очень хороши для проведения прямого эфира и у мня уже появились туманные идеи применения.
      Однако, использовать их относительно контента потенциально опасно: они искажают звуковую картину, являясь динамическими.


      Применительно к контенту, необходимо изменять общую громкость дорожки, не касаясь относительной частотной разности.