Script Bash para extrair o áudio do vídeo

1

Eu escrevi este pequeno script para extrair o áudio do vídeo usando o avconv. Ele estava funcionando bem, mas estranhamente não funciona mais (desde que eu mudei o codec de aac para mp3).

O script deve testar cada arquivo em uma pasta. Se for um vídeo, deve extrair o áudio dele.

Alguém pode me ajudar a consertar isso?

#!/bin/sh
#
# Batch conversion of audio extraction from video
# doesnt work with mkv files (file -i *.mkv returns application/octet)

FOLDER_SRC="/home/J/Music/TestBatchConv"

for myvid in $(find ${FOLDER_SRC})
do
    if file -i $myvid | grep -q video ;
        then avconv -i $myvid -acodec libmp3lame "${myvid}.mp3"
    fi
done

exit 0
    
por riimzzai 10.05.2013 / 18:58

2 respostas

3

Parece que você está usando uma versão antiga do file , onde arquivos MKV não foram detectados corretamente . Você pode usar este arquivo ~/.magic para ter file de identificação de MKV.

Mas, na verdade, a maneira mais confiável de verificar se há arquivos de vídeo válidos seria simplesmente executar avconv e ver se ele falha ou não. Veja o que você pode fazer:

#!/bin/bash
FOLDER_SRC="/home/J/Music/TestBatchConv"
find "$FOLDER_SRC" -type f -print0 | while IFS= read -r -d '' myvid; do
  echo "Trying to convert $myvid"
  avconv -i "$myvid" -c:a libmp3lame -q:a 4 "${myvid%.*}.mp3" 2>/dev/null || echo "$myvid is not a valid file."
done

Se o arquivo não for um vídeo válido, ou se houver algum erro, avconv será encerrado mesmo assim.

Algumas dicas e explicações:

  • Não há sem necessidade de analisar a saída de ls ou find . Simplesmente use for myvid in "$FOLDER_SRC"/* ou, para uma versão recursiva, use o ** glob com a opção globstar . Aqui, a linha find … | while … pode ser substituída por:

    shopt -s globstar
    for myvid in "$FOLDER_SRC/**"; do
    
  • Não se esqueça de citar corretamente "$myvid" onde quer que você o use no loop, caso contrário, vídeos com espaços em branco no nome quebrarão seu script.

  • Você pode remover a extensão do arquivo original removendo qualquer coisa após o último ponto ${myvid%.*} e substituí-la por .mp3 .
  • Você deve informar avconv para usar a variável codificação de taxa de bits para libmp3lame , por exemplo com -q:a 4 , com valores variando de 0 a 10 e 4 sendo o padrão. Isso proporcionará melhor qualidade de áudio em geral.
por 10.05.2013 / 19:26
0

Para os interessados aqui está o código final de trabalho:

#!/bin/bash
#
# Batch conversion of audio extraction from video

echo $BASH_VERSION
FOLDER_SRC="/home/J/Music/TestBatchConv"

shopt -s globstar

for myvid in "$FOLDER_SRC"/**
do
  echo "$myvid"
  avconv -i "$myvid" -acodec libmp3lame "${myvid%.*}.mp3" 2>/dev/null || echo "$myvid is not a valid file."
done
exit 0
    
por 10.05.2013 / 21:23