Как нормализовать звук в mp3-файлах

Хотя реальная причина проблемы уже была указана, я хочу добавить тот же ответ, так как у меня есть 4 внешних жестких диска.

Любой компьютер, который был изготовлен, предполагает, что источник питания будет следует использовать в соответствии со спецификациями конфигурации и, самое большее, с перегрузкой 20%

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

Любое внешнее USB-устройство должно быть подключено к внешнему источнику питания HUB, чтобы защитить источник питания компьютера. , вместо того, чтобы истощать питание от источника компьютера, поскольку этот подход повредит больше, чем ваш жесткий диск. Напряжение питания в основном такое же, как у недостаточного компьютера или внешнего устройства. Стандарт USB не имеет никакого отношения к маломощному устройству. Подумайте об этом так: если вы хотите получить энергию от своего автомобиля, какое топливо вы бы использовали? Что-нибудь, что горит, или топливо, указанное изготовителем? Здесь точно то же самое. Используя USB-устройства UNPOWERED, он истощает питание от внутреннего источника питания компьютера. У него уже достаточно устройств!

1
задан 22 January 2013 в 23:59

5 ответов

Посмотрите @ mp3gain, который для меня даже лучше, чем normalize-audio

mp3gain -r *.mp3

другой полезной версией может быть -c, который не позволяет спросить, хотите ли вы делать изменения для многих файлов :

mp3gain -c -r *.mp3

, как сказано на странице руководства:

mp3gain не просто выполняет пиковую нормализацию, как это делают многие нормализаторы. Вместо этого он делает некоторый статистический анализ, чтобы определить, насколько громкий файл действительно звучит для человеческого уха. Кроме того, изменения mp3gain делают полностью без потерь. Нет никакого качества, потерянного в изменении, потому что программа напрямую регулирует mp3-файл, без декодирования и повторного кодирования.

mp3gain : этот пакет был удален специально на ubuntu 15.04. Debian предлагает python-rgain заменить. После его установки запустите replaygain.

В качестве альтернативы удалите файл .deb для 14.04 (последний) из удален . Установите как обычно. После этого вам нужно запустить sudo apt-get -f install, чтобы исправить некоторые проблемы с зависимостями.

26
ответ дан 25 May 2018 в 02:12
  • 1
    Кроме того, если вы не хотите использовать терминал, для него имеется GUI easymp3gain-gtk, что делает его очень удобным! – nh7149 13 November 2014 в 01:26
  • 2
    Это очень полезно. Я был очень впечатлен качеством нормализации с использованием графического интерфейса Windows MP3Gain, поэтому я был рад найти этот ответ, когда мне было необходимо решение командной строки Linux. Определенно рекомендую другим. – Alex P. Miller 5 February 2015 в 22:05
  • 3
    Не могли бы вы добавить некоторую информацию о том, как ее установить? По умолчанию он не работает с Ubuntu, и я не могу найти пакет. – Błażej Michalik 3 May 2016 в 20:36
  • 4
    @ BłażejMichalik сделано ... – Philippe Gachoud 4 May 2016 в 10:20

Я бы использовал этот проект Normalize, это инструмент командной строки для нормализации аудиофайлов. Похоже, именно то, что вам нужно. Может выполнять пакетную обработку и не требует передискретизации в промежуточные форматы.

Он находится в репозитории пакета как normalize-audio, sudo apt-get install normalize-audio. Это сборка, поддерживаемая выше по течению от Debian, поэтому она должна быть в любом LTS или новее и построена с поддержкой mp3 (протестирована). Существует хорошая manpage man normalize-audio для изучения параметров, но по умолчанию команды по умолчанию работают хорошо. Для пакетной обработки (нормализовать объем для нескольких файлов), normalize-audio -b *.mp3 или указать отдельные имена файлов вместо использования подстановочных знаков.

10
ответ дан 25 May 2018 в 02:12
  • 1
    OP хочет инструкции для этого. Можете ли вы предоставить их? – Seth♦ 23 January 2013 в 00:13
  • 2
    @iSeth Я был изначально неверен относительно комментария только для источника, потому что я не смог найти его с помощью поиска apt-cache. Я обновил информацию о пакете deb. – sean_m 23 January 2013 в 14:23
  • 3
    Это кажется хорошей альтернативой, но не может найти правильный кодировщик и избавиться от «отсутствующего кодера» . Пробовал с помощью libsox-fmt-mp3, libavcodec-extra. -b *.mp3 делать что-то только с одним (случайным?) файлом. – Pablo Bianchi 22 March 2017 в 23:04

Ради этого я брошу свои 2 цента. Я искал точно то же самое (только для файлов ogg) и начал тему на форуме Crunchbang. Вы можете посмотреть его здесь: Normalize-audio не может найти mp3-декодер

В основном мое решение было скриптом в статье №8.

Просто создайте файл (назовите его, что бы вы ни хотели, я назвал мой db_adjust_mp3), chmod + x и придерживаюсь его. в папке ~ / bin. Он также заполняет любые отсутствующие данные кодека. Пример:

Исходный файл: 16._This_Protector.mp3: Audio file with ID3 version 2.3.0, contains:

vs.

Нормализованный файл: 16._This_Protector.mp3: Audio file with ID3 version 2.3.0, contains: MPEG ADTS, layer III, v1, 192 kbps, 44.1 kHz, JntStereo

Я изменил скрипт для использования normalize-mp3 здесь, чтобы вы могли использовать его, если хотите:

#!/bin/bash

find "$1" -iname "*.""$2" > $HOME/file_list

cat $HOME/file_list | while read line; do
#  echo "$line"
  orig_gain="$(normalize-mp3 -n "$line" | cut -d 'd' -f1)"
  larger=$(echo "$orig_gain"'>'-12 | bc)
  if [[ larger ]]
    then
      gain_difference=$(echo "$orig_gain"*-1-12 | bc)
    else
      gain_difference=$(echo "$orig_gain"-12 | bc)
  fi
  echo "Gain Difference will be: $gain_difference""db"
  normalize-ogg --mp3 --bitrate "$3" -g "$gain_difference""db" -v "$line"
done

Этот скрипт вычисляет разницу между текущим уровнем db и -12db, затем применяет регулировку усиления, чтобы точно установить коэффициент усиления -12db, и это то, что я нашел, работает лучше для меня. Он также рекурсивный, что делает его отличным для выполнения целых музыкальных коллекций или файлов во многих подпапках. Если вы хотите установить другой уровень db, просто измените оба экземпляра числа «12» на любой уровень db, который вы хотели бы использовать. Как я писал в моем потоке Crunchbang, использование выглядит следующим образом:

normalize-mp3 <directory> <file extenstion(with no leading dot)> <bitrate>

Однако, когда я использовал мою музыкальную библиотеку в формате mp3, я тоже использовал mp3gain, как и предложил Филипп. Мертвая простота этого велика, и мне это очень понравилось. Проблема с normalize-audio заключается в том, что она расшифровывает код повторного кодирования файлов, поэтому происходит некоторая ухудшение качества звука. Но если вы не аудиофил, а ваши mp3 закодированы с высоким битрейтом, вы не заметите большой разницы.

То, что я заметил с помощью mp3gain, было то, что независимо от того, какие параметры я пытался, я не мог получить все в моей коллекции, чтобы быть точно таким же уровнем дБ, который я хочу, чтобы мне никогда не приходилось регулировать громкость с одного трека на другой. Этот скрипт делает именно это. Извините за то, что вы так долго наматывались. Надеюсь, это поможет.

3
ответ дан 25 May 2018 в 02:12

replaygain

В Ubuntu 16.4 У меня были проблемы с другими альтернативами CLI. Затем я нашел replaygain:

Этот пакет предоставляет пакет Python для вычисления значений Replay Gain аудиофайлов и нормализации объема этих файлов в соответствии со значениями. Также отправляются два основных сценария, использующих эти возможности. Replay Gain - это предлагаемый стандарт, предназначенный для решения самой проблемы изменения объема аудиофайлов.

Установить: sudo apt install python-rgain.

replaygain --force *.mp3
-f, --force Пересчитать коэффициент повтора, даже если файл уже содержит информацию об усилении.

Ссылка

-f, --force Пересчитать коэффициент повтора, даже если файл уже содержит информацию об усилении. python-rgain на Launchpad
2
ответ дан 25 May 2018 в 02:12

Мне больше всего понравился ответ Нила, потому что он не вносит корреляции между аудиофайлами: просто выберите один уровень усиления и настройте все на него.

Однако у меня возникли некоторые проблемы, анализирующие вывод с некоторыми файлами, которые у меня есть. Существует также одна неприятная проблема с bc: она не делает реального округления, она только усекает.

Итак, в конце концов я отказался от сценариев оболочки и перешел на python.

Примечание1: часть exiftool может быть чрезмерной, но я хотел быть на 100% уверен, что исходный биттрейт будет сохранен.

Примечание1: это перезапишет оригиналы, если вы хотите сохраните их, используйте -backup в последнем вызове normalize-ogg.

Note3: это решение относится к файлам ogg, но тривиально адаптировать его к mp3, просто замените вхождения «ogg», с «mp3».

Вот мое решение проблемы. Последнюю версию можно найти здесь: regain.py

#!/usr/bin/python3
"""
Parallel normalize gains
"""
'
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
'

# Absolute value, in dB for the desired gain of each file
TARGET_GAIN = -12

# 
MAX_THREADS = 2

from subprocess import Popen, PIPE
from multiprocessing.dummy import Pool as ThreadPool
from os import listdir
import logging

def initlogger(logfile="log.log", mainlevel=logging.DEBUG,
               filelevel=logging.DEBUG, consolelevel=logging.DEBUG):
    '''initlogger'''
    # create logger 
    logger = logging.getLogger()
    logger.setLevel(mainlevel)
    # create file handler which logs even debug messages
    fh = logging.FileHandler(logfile)
    fh.setLevel(filelevel)
    # create console handler also logging at DEBUG level
    ch = logging.StreamHandler()
    ch.setLevel(consolelevel)
    # create formatter and add it to the handlers
    formatter = logging.Formatter("%(asctime)s [%(threadName)-12.12s] [%(levelname)-5.5s]  %(message)s")
    fh.setFormatter(formatter)
    ch.setFormatter(formatter)
    # add the handlers to the logger
    logger.addHandler(fh)
    logger.addHandler(ch)

def logcommand(command=[]):
    '''logcommand'''
    if not isinstance(command, list):
        return "", "", -1
    logging.info("Command:\n" + " ".join(command) + "\n")
    proc = Popen(command, stdin=PIPE, stdout=PIPE, stderr=PIPE)
    output, err = proc.communicate()
    output = output.decode("utf-8")
    err = err.decode("utf-8")
    logging.info("Output:\n" + output + "\n")
    logging.info("Error:\n" + err + "\n")
    logging.info("Return Code:\n" + str(proc.returncode) + "\n")
    return output, err, proc.returncode

def regain(target):
    '''regain'''
    logging.info("============================ Start File  ============================")
    logging.warning(target["name"])
    logging.info("Extracting gain info.\n")
    commandgetlevels = ['normalize-ogg', '-n', target["name"]]
    output, err, retcode = logcommand(commandgetlevels)

    level  = output.split()[0]
    logging.debug("Level: " + level)
    if "dBFS" in level:
        level = level.split("dBFS")[0]
    level = level.replace(',', '.')
    level = int(round(float(level)))
    delta = target["gain"] - level
    logging.info("Required adjustment: " + str(delta) + "\n")
    if delta is 0:
        logging.warning(target["name"] + " is already at the correct level")
        return 0

    logging.info("Extracting average bitrate.\n")
    commandgetinfo = ['exiftool', target["name"]]
    output, err, retcode = logcommand(commandgetinfo)
    bitrate = '0'
    for line in output.split('\n'):
        if 'Nominal Bitrate' in line:
            bitrate = line.split(':')[1].split()[0]
            break
    logging.info("Average bitrate is: " + str(bitrate) + "\n")
    if bitrate is '0':
        logging.error("No valid bitrate found, aborting conversion.\n")
        exit(-1)

    logging.info("Re-normalizing.\n")
    commandrenormalize = ['normalize-ogg', '--ogg', '--bitrate', bitrate,
                          '-g', str(delta) + 'db', target["name"]]
    output, err, retcode = logcommand(commandrenormalize)
    if retcode is not 0:
        log.error("Output:\n" + output)
        log.error("err:\n" + err)
        exit(retcode)

    return retcode

# function to be mapped over
def parallelregain(gain=TARGET_GAIN, threads=MAX_THREADS):
    '''parallelregain'''
    logging.info("Creating thread pool with " + str(threads) + " elements.\n")
    pool = ThreadPool(threads)
    targets = []
    files_list = listdir(".")
    files_list.sort()
    counter = 0
    for filename in files_list:
        if filename.endswith("ogg"):
            target = {
                "name":filename,
                "gain":gain,
            }
            targets.append(target)
            counter = counter + 1
    pool.map(regain, targets)
    pool.close()
    pool.join()

if __name__ == "__main__":
    initlogger(logfile="normalize.log", consolelevel=logging.WARNING)
    parallelregain()
0
ответ дан 25 May 2018 в 02:12

Другие вопросы по тегам:

Похожие вопросы: