Как нормализовать файл видео(mp4) в Android?

#android #android-studio #ffmpeg #audio-streaming #equalizer

Вопрос:

Я хочу реализовать функцию нормализации звука видео. Я провел некоторые исследования и разработки, но не нашел подходящего решения.

У меня также есть сомнения в том, должен ли я извлекать аудио из видео, а затем нормализовать его, а затем объединить аудио в видео(что может быть трудоемкой задачей), или я могу напрямую нормализовать видеофайл?

Или, если для этого есть какая-либо конкретная команда FFmpeg, я бы с удовольствием ее использовал.

Комментарии:

1. Для FFmpeg есть фильтр EBU R 128: ffmpeg.org/ffmpeg-filters.html#loudnorm . Или, если вы хотите сделать это вручную: trac.ffmpeg.org/wiki/AudioVolume . В обоих случаях потребуется перекодировать звуковую дорожку.

2. На самом деле, я хочу реализовать его для файлов видео(.mp4). Можно ли нормализовать звук в уже записанных видео?

3. Для совместимости со всеми проигрывателями вы можете сохранить закодированную видеодорожку как есть и перекодировать только звуковые дорожки. Возможно, вместо этого можно указать метаданные ReplayGain, если проигрыватель поддерживает их во время воспроизведения.

Ответ №1:

Я нашел одно решение для вышеуказанного вопроса.

Мы можем использовать команду FFmpeg для нормализации звука в видео. Но перед этим нам нужно выяснить, какую выгоду можно применить

Во-первых, нам нужно проанализировать аудиопоток на максимальную громкость, чтобы увидеть, окупится ли нормализация:

 val complexCommand = arrayOf("-i",videoPath,"-af","volumedetect","-f","null","null")
 

Это выведет что-то вроде следующего:

 [Parsed_volumedetect_0 @ 0x7f8ba1c121a0] mean_volume: -16.0 dB
[Parsed_volumedetect_0 @ 0x7f8ba1c121a0] max_volume: -5.0 dB
[Parsed_volumedetect_0 @ 0x7f8ba1c121a0] histogram_0db: 87861
 

Как вы можете видеть, наша максимальная громкость составляет -5,0 дБ, поэтому мы можем применить усиление на 5 дБ. Если вы получаете значение 0 дБ, то вам не нужно нормализовать звук.

Теперь мы можем нормализовать файл .mp4, используя следующую команду FFmpeg.

 val complexCommand = arrayOf(
        "-i",
        originalVideoPath,
        "-af",
        "volume= 5.0dB",
        "-c:v", "copy",
        "-c:a",
        "aac",
        "-strict",
        "experimental",
        "-b:a",
        "128k",
        destinationPath
    )
 

128 Кб-это скорость передачи аудио в битах видео, которую нам нужно установить. Это может варьироваться в зависимости от видео.