Como extrair áudio de DVDs no muque

Referência: Ubuntu. Usando MPlayer, FFmpeg e LAME.

sudo apt-get install mplayer ffmpeg lame

#!/bin/bash

for capitulo in $(seq 1 10)
do
mplayer dvd://1 -chapter ${capitulo}-${capitulo} -dumpfile "cap-${capitulo}.vob" -dumpstream
ffmpeg -i "cap-${capitulo}.vob" -f wav - 2>/dev/null | lame -V 2 - "faixa-${capitulo}.mp3"
rm "cap-${capitulo}.vob"
done

Senta que lá vem história...

Esse exemplo leva em conta um DVD com apenas um título (dvd://1). Se forem mais, terá que ser adaptado de acordo. -chapter ${capitulo}-${capitulo} instrui o MPlayer a extrair (-dumpstream) capítulo por capítulo individualmente. O FFmpeg, então, decodifica e extrai o áudio do arquivo VOB (MPEG2-TS) e passa via pipe no formato WAV (pcm_s16le) para o LAME, que converte para MP3 usando o modo -V 2, que é a minha recomendação. Finalmente o arquivo VOB é apagado. Começa novamente para cada capítulo definido no intervalo do comando seq 1 10 (1 a 10 nesse caso). Veja aí quantos capítulos tem determinado título do seu DVD.

No script acima, o MPlayer busca direto da unidade óptica. Se for um DVD comercial, você precisa ter instalado o pacote libdvdcss2. No Medibuntu você acha.

Caso queira usar uma pasta no HD contendo a estrutura de um DVD (VIDEO_TS), use a opção -dvd-device do MPlayer, como em -dvd-device /home/marcos/Downloads/FOO.

Caso o DVD tenha mais de uma trilha de áudio, existem duas opções. Primeiro, descubra o "aid" de cada uma:

mplayer dvd://1 -vo null -ao null -frames 0 2>/dev/null | grep aid

Se existir uma trilha estéreo ("stereo"), prefira-a, colocando o respectivo identificador na opção -aid xxx do MPlayer. Se existir apenas trilha 5.1, daí só resta mandar o FFmpeg fazer mixdown, adicionando a opção -ac 2 ao comando do FFmpeg, mas nem sempre fica bom...

ffmpeg -i "cap-${capitulo}.vob" -ac 2 -f wav - 2>/dev/null | ...RESTO...

Ah, tudo é feito na pasta atual. Modifique se quiser usar outro lugar como "meio campo".

Bônus

Salvar em Vobris ao invés de MP3. Instale o pacote vorbis-tools e substitua a linha do FFmpeg por:

ffmpeg -i "cap-${capitulo}.vob" -f wav - 2>/dev/null | oggenc -q 5 --ignorelength - -o "faixa-${capitulo}.ogg"

Método que dispensa o uso do FFmpeg

#!/bin/bash

for capitulo in $(seq 1 10)
do
mplayer -benchmark dvd://1 -chapter ${capitulo}-${capitulo} -vc null -vo null -ao pcm:fast:file="cap-${capitulo}.wav"
lame -V 2 "cap-${capitulo}.wav" "faixa-${capitulo}.mp3"
rm "cap-${capitulo}.wav"
done

Pena não ser possível direcionar a saída do MPlayer para STDOUT para jogar via pipe diretamente para o LAME. Apesar disso, essa forma tem a vantagem de escrever menos no disco (o WAV é menor que o VOB) e o MPlayer automaticamente faz mixdown para estéreo quando necessário.

Comentários