3

У меня есть куча стереофонических MP3, которые я бы хотел конвертировать в моно. Каков наилучший способ сделать это? Я бы предпочел что-то, что позволило бы обрабатывать их партиями. Я хочу сохранить качество как можно ближе к оригиналу. Мои файлы также имеют разные битрейты, поэтому я не хочу делать все файлы 320kpbs, когда некоторые только 128.

Кроме того, есть ли быстрый способ увидеть, какие файлы стерео из всей моей библиотеки?

4 ответа4

3

Преобразование из стерео в моно будет означать перекодирование, поэтому сохранение одинаковой скорости передачи будет бессмысленным. Фактически, преобразование 128 кбит / с MP3 -> нового 128 кбит / с MP3 принесет вам чертовски ужасное качество, даже если второе - моно (и, следовательно, требует более низкой скорости передачи для того же субъективного качества).

Как правило, я бы использовал настройку переменной битовой скорости (VBR) для MP3, которая нацелена на конкретное качество и позволяет кодировщику устанавливать любую необходимую битовую скорость (для полностью тихого звука требуется более низкая скорость передачи, чем у китовой песни, которая требует более низкую скорость передачи данных, чем ДАП СТЕП). Из командной строки ffmpeg может конвертировать аудио в моно с опцией -ac 1 , например так:

ffmpeg -i input.mp3 -c:a libmp3lame -q:a 2 -ac 1 output.mp3

Смотрите эту страницу для руководства по использованию -q:a . Обратите внимание, что таблица на этой странице предназначена для стереозвука; фактические битрейты, которые вы увидите, будут несколько ниже. Обычно я рекомендую 3-4, но поскольку вы кодируете из MP3, а не с оригинального CD, вам следует стремиться к чему-то более высокому.

Это, конечно, может быть очень легко автоматизировано. В Linux/OSX/ других UNIX-подобных, для преобразования каталога MP3:

for f in *.mp3; do ffmpeg -i "$f" -c:a libmp3lame -q:a 2 -ac 1 mono-"$f"; done

Чтобы сделать это рекурсивно:

find . -type f -name "*.mp3" -exec ffmpeg -i '{}' -c:a libmp3lame -q:a 2 -ac 1 mono-'{}' \;

Если у вас есть GNU Parallel и многоядерный компьютер, вы можете найти это полезным:

find . -type f -name "*.mp3" | parallel ffmpeg -i {} -c:a libmp3lame -q:a 2 -ac 1 mono-{}
3

Ну, есть несколько способов, но позвольте мне привести вас к тем, которые действительно работают. Вы можете использовать Audacity, бесплатное программное обеспечение для этого.

Пожалуйста, ознакомьтесь со статьей eHow о том, как конвертировать MP3 в моно.

1

Lame может конвертировать в файлы в моно, используя ключ -m, преимущество которого заключается в сохранении мета-тегов (я не уверен, что ffmpeg тоже может это делать).

Вот несколько сложный пример, который определяет битрейт mp3 перед тем, как перекодировать его с одним из параметров качества битрейта с переменной скоростью.

cat s2mono.sh
#!/bin/bash

mp3file=$@

mp3size () {
    du -sk "$1" | awk '{print $1 * 8 }'
}
mp3length () {
    id3info "$1" | \
        awk '/=== TLEN/ { if ($NF > 0) { len=int( $NF/1000) }} END {print len}'
}
mp3rate () {
    echo $(( `mp3size "$1"` / `mp3length "$1"` ))
}

bitrate=`mp3rate "$mp3file"`
if [ $bitrate -gt 155 ]; then VBR='-V4'; fi
if [ $bitrate -gt 190 ]; then VBR='-V2'; fi
if [ $bitrate -gt 249 ]; then VBR='-V0'; fi

echo downsampling $mp3file
lame --silent $VBR -m m --mp3input "$mp3file" \
      "$(basename "$mp3file" .mp3 )-mono.mp3"

Я запустил это в папке, где общий размер всех mp3-файлов был 80 МБ в стерео формате. Получившиеся монофонические mp3-файлы заняли всего 32 МБ.

 find . -iname \*mp3  -print0 |xargs -0 -L1 sh s2mono.sh
 (...)

 du -skc *-mono.mp3| tail -n1
 32376   total

 find . -iname \*mp3  |grep -ve '-mono'  |\
     while read f; do du -sk "$f" ;done  |\
     awk '{ tot+=$1} END{print tot}'
 80112

Что касается последней части вашего вопроса, file будет делать:

 find /R/audio/muzica/_ripped/wav  -exec file {} \+   |grep Monaural
0

Основываясь на этом ответе, вы можете получить более переносимое решение (без дополнительных зависимостей, без проблем с тегами ID3v1 и ID3v2), просто используя file и sed . Я также добавил немного больше настроек битрейта.

В этом сценарии вы должны указать входные и выходные файлы в командной строке.

#!/bin/bash
#
# Usage: (this script) stereo-input.mp3 mono-output.mp3
#
# concept via https://superuser.com/a/566023/253931
#

# gnu/linux
bitrate=`file "$1" | sed 's/.*, \(.*\)kbps.*/\1/'`

# osx
# bitrate=`afinfo "$1" | grep "bits per second" | sed 's/.*: \(.*\)000 bits per second.*/\1/'`

BR='-V9'
if [ $bitrate -gt  75 ]; then BR='-V8'; fi
if [ $bitrate -gt  90 ]; then BR='-V7'; fi
if [ $bitrate -gt 105 ]; then BR='-V6'; fi
if [ $bitrate -gt 120 ]; then BR='-V5'; fi
if [ $bitrate -gt 145 ]; then BR='-V4'; fi
if [ $bitrate -gt 170 ]; then BR='-V3'; fi
if [ $bitrate -gt 180 ]; then BR='-V2'; fi
if [ $bitrate -gt 215 ]; then BR='-V1'; fi
if [ $bitrate -gt 230 ]; then BR='-V0'; fi
if [ $bitrate -gt 280 ]; then BR='-b320'; fi

echo "mono-izing file with detected bitrate '$bitrate': $1"
lame --silent $BR -m m --mp3input "$1" "$2"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .