Convertendo um monte de MP3s para mono?

3

Eu tenho um monte de MP3s estéreo que eu gostaria de converter em mono. Qual é a melhor maneira de fazer isso? Eu preferiria algo que permitisse processá-los em lote. Quero manter a qualidade o mais próxima possível do original. Meus arquivos também estão em bitrates diferentes, então eu não quero fazer todos os arquivos 320kpbs quando alguns são apenas 128.

Além disso, existe alguma maneira rápida de ver quais arquivos são estéreo de toda a minha biblioteca?

    
por Wil 21.08.2011 / 09:26

4 respostas

3

Bem, existem várias maneiras, mas deixe-me guiá-lo para as que realmente funcionam. Você pode usar o Audacity , um software gratuito disponível para isso.

Por favor, veja este artigo do eHow sobre como converter o MP3 para mono.

    
por 21.08.2011 / 09:47
2

A conversão de estéreo para mono significará a re-codificação, portanto, manter a mesma taxa de bits não teria sentido. De fato, converter um MP3 de 128 kbit / s - > um novo MP3 de 128 kbit / s lhe renderá uma qualidade tremendamente terrível, mesmo se o segundo for mono (e, portanto, exigir uma taxa de bits menor para a mesma qualidade subjetiva).

Geralmente, eu usaria uma configuração de taxa de bits variável (VBR) para MP3, que tem como alvo uma qualidade específica e permite que o codificador defina a taxa de bits necessária (o áudio completamente silencioso precisa de uma taxa de bits menor que o whalesong, que precisa de um menor taxa de bits do que dubstep). A partir da linha de comando, o ffmpeg pode converter áudio para mono com a opção -ac 1 , assim:

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

Veja esta página para um guia sobre como usar -q:a . Observe que a tabela nessa página é destinada a áudio estéreo; as taxas de bits reais que você verá serão um pouco menores. Normalmente, eu recomendo 3-4, mas como você está codificando de MP3s ao invés de um CD original, você deve mirar um pouco mais alto.

Isso, claro, pode ser automatizado com muita facilidade. No Linux / OSX / outro tipo UNIX, para converter um diretório de MP3s:

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

Para fazer isso de forma recursiva:

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

Se você tem o GNU Parallel e uma máquina multi-core, você pode achar isto útil:

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

O Lame pode converter arquivos em mono usando a opção -m, a vantagem de preservar as metatags (não tenho certeza se o ffmpeg também pode fazer isso).

Aqui está um exemplo um pouco complicado que determina a taxa de bits de um mp3 antes de transcodificá-lo com uma das opções de qualidade de taxa de bits variável.

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"

Eu corri isso em uma pasta onde o tamanho total de todos os mp3s era de 80 MB no formato estéreo. Os mono mp3s resultantes consumiram apenas 32 MB.

 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

Quanto à última parte da sua pergunta, file será o seguinte:

 find /R/audio/muzica/_ripped/wav  -exec file {} \+   |grep Monaural
    
por 14.03.2013 / 20:11
0

Com base na esta resposta , você pode obter uma solução mais portátil (sem dependências extras, sem problemas com ID3v1 vs ID3v2 tags) usando apenas file e sed . Eu também preenchi um pouco mais das configurações de taxa de bits.

Neste script, você deve especificar os arquivos de entrada e saída na linha de comando.

#!/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.*//''

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

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"
    
por 13.09.2013 / 20:15