Batch extrai áudio com avconv sem transcodificação

13

Tenho cerca de 70 arquivos mp4 e quero extrair os arquivos de áudio diretamente sem transcodificar ainda mais. Todos os arquivos mp4 têm arquivos de áudio aac.

Eu entendo que posso usar o seguinte comando para extrair o arquivo de áudio de um dos arquivos mp4:

avconv -i "INPUT FILE" -map 0:1 -c:a copy "OUTPUT FILE"

Como faço para extrair todos os arquivos de áudio de todos os arquivos de 70 mp4, então acabo com 70 arquivos aac?

    
por oshirowanen 04.01.2013 / 01:41

4 respostas

19

Você pode usar um loop for simples:

for i in *.mp4; do
    avconv -i "${i}" -map 0:1 -c:a copy "${i%.mp4}.aac"
done

ou em uma linha:

for i in *.mp4; do avconv -i "${i}" -map 0:1 -c:a copy "${i%.mp4}.aac"; done

O que você faz é executar avconv uma vez para cada arquivo chamado *.mp4 , onde o nome do arquivo é armazenado na variável ${i} .

${i%.mp4} significa ${i} (ou seja, o nome do arquivo) com .mp4 removidos do final.

    
por Andrew Gunnerson 04.01.2013 / 03:38
5

A resposta de Xiao é geralmente a mais útil se você tiver todos os arquivos em um diretório; mas se houver arquivos MP4 espalhados em diretórios diferentes, você pode usar este comando find para convertê-los todos.

find . -type f -name '*.mp4' -exec bash -c 'avconv -i "$0" -c:a copy "${0/%mp4/m4a}"' {} \;

Isto usa uma forma ligeiramente diferente de substituição de string bash no final: "$ {0 /% mp4 / m4a}" diz ao bash para substituir o mp4 pelo m4a, mas somente se o mp4 estiver no final da string. / p>     

por evilsoup 04.01.2013 / 04:21
3

Para evitar que vários arquivos sejam processados ao mesmo tempo (que podem usar muitos recursos), use parallel . Por padrão, ele faz apenas um trabalho por vez. Se você deseja usar vários núcleos de CPU em paralelo, tente parallel -j 4 ... para 4 tarefas em paralelo. Confira também man parallel .

sudo apt-get install parallel

Esta linha extrairá aac arquivos de áudio de vídeos selecionados e os colocará em m4a containers.

parallel avconv -i '{}' -map 0:1 -c:a copy '{.}.m4a' ::: %F

Ao trabalhar diretamente na CLI, substitua %F pela lista de seus arquivos de entrada. Por exemplo. *.mp4 .

Inspirado por esta resposta, por uma resposta anterior para esta questão, e pelo comentário do evilsoup para o último (dizendo: 'arquivos raw aac não podem conter metadados; se você quiser manter metadados dos arquivos originais, use m4a (que é apenas outro nome para mp4, mas é amplamente reconhecido por players de áudio) em vez de aac como um arquivo extensão ').

Eu uso esses comandos em ações personalizadas do Thunar,

limitandooaplicativoavídeosquecontenhamaacáudio.

Para ter uma janela de terminal aberta durante o processamento, que fecha no final, o comando pode ser alterado como:

 gnome-terminal -e "parallel avconv -i '{}' -map 0:1 -c:a copy '{.}.m4a' ::: %F"
    
por cipricus 12.05.2013 / 18:00
2

Eu estendi a resposta do @ Xiao-Long Chen, transformando-a em um script que ignora arquivos quando o arquivo de saída é mais recente:

#!/bin/bash

for file in *.mp4; do
    OUT="${file/.mp4/.m4a}"

    if [ "$file" == "$OUT" ]; then
        echo "Unable to handle $file" >&2
        exit 1
    fi

    if [ "$OUT" -nt "$file" ]; then
        echo "Skipping $file; output file is newer."
        continue
    fi

    echo "Converting \"$file\" -> \"$OUT\""
    avconv -loglevel warning -i "$file" -map 0:1 -c:a copy "$OUT"
done
    
por dr. Sybren 01.07.2015 / 10:03