como eu posso extrair o áudio de arquivos mp4 com o ffmpeg sem descompactação (detecção automática de codecs de áudio)?

16

Eu tenho 228 arquivos mp4 (2.6GB) e gostaria de extrair o áudio deles (mp3 ou ogg). Eu quero extraí-los em lote - de preferência com bash. Não tenho certeza se todos os arquivos usam o mesmo codec de áudio que foram gravados em anos diferentes, variando de 2006 a 2012.

Eu quero percorrer todos eles, escolher o nome do arquivo, detectar o codec de áudio e usar o ffmpeg para extrair o áudio.

É possível?

    
por wryrych 23.11.2012 / 18:33

2 respostas

25

Você diz que deseja "extrair o áudio deles (mp3 ou ogg)". Mas e se o áudio no arquivo mp4 não for um desses? você teria que transcodificar de qualquer maneira. Então, por que não deixar a detecção do formato de áudio no ffmpeg?

Para converter um arquivo:

ffmpeg -i videofile.mp4 -vn -acodec libvorbis audiofile.ogg

Para converter muitos arquivos:

for vid in *.mp4; do ffmpeg -i "$vid" -vn -acodec libvorbis "${vid%.mp4}.ogg"; done

Você pode, é claro, selecionar qualquer parâmetro ffmpeg para a codificação de áudio que desejar, para definir coisas como taxa de bits e assim por diante.

Use -acodec libmp3lame e altere a extensão de .ogg para .mp3 para codificação mp3.

Se o que você quer é realmente extrair o áudio, você pode simplesmente "copiar" a trilha de áudio para um arquivo usando -acodec copy . É claro que a principal diferença é que a transcodificação é lenta e exige muita CPU, enquanto a cópia é realmente rápida, já que você está apenas movendo bytes de um arquivo para outro. Veja como copiar apenas a faixa de áudio (supondo que esteja no formato mp3):

ffmpeg -i videofile.mp4 -vn -acodec copy audiofile.mp3

Observe que, nesse caso, o formato do arquivo de áudio tem para ser consistente com o conteúdo do contêiner (ou seja, se o áudio for formato AAC, você deverá informar audiofile.aac ). Você pode usar o comando ffprobe para ver qual codec você tem, isso pode fornecer algumas informações:

ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -print_format csv=p=0 "videofile.mp4"

Uma maneira possível de analisar automaticamente o codec de áudio e nomear o arquivo de áudio de acordo seria:

mkdir -p output
# current directory has to contain at least one .mp4 file 
for vid in *.mp4; do
   codec="$(ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -print_format csv=p=0 "$vid")"
   case "$codec" in
    mp3    ) filetype=mp3 ;;
    vorbis ) filetype=ogg ;;
    *      ) filetype= ;;
   esac

   if [ "$filetype" ]; then 
    ffmpeg -i "$vid" -vn -acodec copy output/"${vid%.*}"."$filetype"
   else
    ffmpeg -i "$vid" -vn -acodec libvorbis output/"${vid%.*}".ogg
done

Notas: os arquivos de saída são criados no subdiretório output criado no início (se necessário). Para outros codecs que mp3 e vorbis ele converte áudio para ogg. O Ubuntu 14.04 não possui ffmpeg em repositórios padrão, mas você pode adicionar o repositório ppa: mc3man / trusty-media e instalar o pacote ffmpeg para obter o software necessário. Veja aqui para detalhes.

    
por roadmr 23.11.2012 / 20:31
1

Como Nicolas Raoul afirmou, isso precisa ser atualizado. Aqui está a mesma linha que o roadmr deu, mas usando o avconv:

for vid in *.mp4; do avconv -i "$vid" "${vid%.mp4}.mp3"; done

    
por Scooby-2 09.03.2015 / 21:43

Tags