Como usar o Ffmpeg para converter wma para mp3 recursivamente, importando do arquivo txt?

4

Eu tentei diferentes opções de fóruns, mas a maioria deles está desatualizada (ffmpeg me fala sobre isso, como com a opção -sameq). Estou tentando entender os documentos, mas não consigo.

Eu quero saber como converter recursivamente com ffmpeg de wma para mp3 com um bitrate máximo de 192kbps na saída (mas não 192, se o original for 128kbps)

Eu tenho menos de 14K arquivos wma espalhados em muitos diretórios. Então, eu não quero movê-los. Basta convertê-los mantendo o nome do arquivo e os metadados, e apagá-los, se for possível ler a lista de arquivos para converter a partir de um arquivo txt que eu possa criar, um arquivo por linha. Com isso, eu conseguiria fazer a pesquisa recursiva, uma pasta nele.

Obrigado por qualquer ajuda. E ainda mais obrigado por qualquer explicação sobre o Ffmpeg.

Caroxo

PS: Soundconverter costumava ser bom, mas lento. Agora nem um nem outro. Não funciona em 14.04 em muitos casos, como o meu. Estou usando o Soundkonverter, mas é muito lento. Então, tudo isso para evitar essas recomendações. E eu quero aprender a usar esse poderoso ffmpeg! e o CLI

NOTA: O script abaixo, estava trabalhando nas primeiras conversões. Mas por qualquer motivo que eu não posso explicar, de repente excluiu o wma em conversão, sem deixar o mp3. Então, mudei de novo para "não resolvido" (para evitar ocasionalmente problema para outra pessoa). O problema parece vindo de avconv "Aplicativo fornecido inválido, não monotonicamente aumentando dts para muxer no fluxo 0: 23606 > = 21720" (há pastebins nos comentários, se houver alguém interessado em desenvolver esse bug). Então, sem avconv no futuro.

    
por CaRoXo 07.08.2014 / 21:32

6 respostas

11

Este é o comando que eu uso para ffmpeg todos os arquivos no diretório atual (funciona se os nomes tiverem espaços neles) no Mac onde brew não tem avconv:

for file in *.wma; do ffmpeg -i "${file}"  -acodec libmp3lame -ab 192k "${file/.wma/.mp3}"; done
    
por Dan Rahmel 28.01.2015 / 00:34
7

Em um terminal, primeiro procure a pasta que contém todas as suas músicas usando cd , por exemplo:

cd /home/username/music/wma-to-convert

O seguinte fará uma lista de todos os arquivos na pasta atual e todas as subpastas terminadas em "wma" e armazenará a lista em um documento de texto chamado wma-files.txt :

find . -type f | grep wma$ > wma-files.txt

Ou você pode criar o arquivo de texto manualmente, se quiser. Em seguida, digite o seguinte em um editor de texto e salve-o no mesmo diretório de wma-files.txt , por exemplo, nomeando-o conv-script :

#!/usr/bin/env bash

readarray -t files < wma-files.txt

for file in "${files[@]}"; do
    out=${file%.wma}.mp3
    probe='avprobe -show_streams "$file" 2>/dev/null'
    rate='echo "$probe" | grep "^bit_rate" | sed "s:.*=\(.*\)[0-9][0-9][0-9][.].*::" | head -1'
    ffmpeg -i "$file" -ab "$rate"k "$out"
done

Você provavelmente precisa definir o bit executável no script:

chmod +x conv-script

Em seguida, basta executá-lo:

./conv-script

Você também tem a opção de adicionar isso ao final da linha ffmpeg , mas tenha cuidado:

 && rm "$file"

Para aqueles que não têm acesso ao avprobe, você pode usar o ffprobe, que faz o equivalente (ou seja, obtendo o bit_rate). Para fazer isso:

Substituir:

probe='avprobe -show_streams "$file" 2>/dev/null'
rate='echo "$probe" | grep "^bit_rate" | sed "s:bit_rate=\([0-9]\+\)[0-9]\{3\}::" | head -1'

com:

rate='ffprobe -v error -show_entries format=bit_rate -of default=noprint_wrappers=1:nokey=1 "$file"'

Uma vez feito isso, todos os seus arquivos devem começar a converter e os originais wma devem ser deletados! Isso funcionou muito bem para mim converter arquivos flac para mp3. Infelizmente não tenho nenhum wma para testar, mas espero que seja bom para eles também.

NOTA: Embora eu não preveja nenhum problema, seria uma boa idéia copiar alguns arquivos para um novo diretório e testá-los neles.

Se você planeja freqüentemente converter Wma para mp3, o script abaixo converte e exclui automaticamente tudo na pasta fornecida como um argumento, Isso melhora um pouco o acima mencionado. Além disso, o comando ffmpeg é um pouco diferente do primeiro proposto, se o primeiro não funcionar, use o abaixo.

#!/usr/bin/env bash

cd "$1"
find . type f | grep wma$ > wma-files.txt

readarray -t files < wma-files.txt

for file in "${files[@]}"; do
    out=${file%.wma}.mp3
    ffmpeg -i "$file" -map_metadata 0:s:0 $out"
done
rm wma-files.txt

Então, você simplesmente o chama digitando seu terminal como:

./convScript /home/username/music

Assim, toda a pasta de músicas e suas subpastas terão sua música wma convertida automaticamente em mp3.

Como antes, você pode adicionar isso ao final da linha ffmpeg para remoção do arquivo:

&& rm "$file"

EDIT (2017/06/23): não torna rm o padrão

    
por TheSchwa 07.08.2014 / 22:53
3

Para qualquer versão

Eu encontrei uma maneira legal de fazer isso com o mplayer. Esse script renomeará os arquivos para remover todos os espaços em branco nos nomes dos arquivos e converterá recursivamente todos os arquivos .wma no diretório atual para .mp3:

#!/bin/bash
for f in *.wma; do
 newname='echo $f | tr ' ' '_' '
 mv "$f" $newname
 f=$newname
 mplayer $f -novideo -ao pcm:file=tmp.wav
 lame -V 0 -q 0 tmp.wav ${f/.wma/.mp3}
 rm -f tmp.wav
done

Aqui está uma versão de um liner:

for f in *.wma; do; newname='echo $f | tr ' ' '_' '; mv "$f" $newname; f=$newname; mplayer $f -novideo -ao pcm:file=tmp.wav; lame -V 0 -q 0 tmp.wav ${f/.wma/.mp3}; rm -f tmp.wav; done
    
por mchid 08.12.2015 / 22:43
3

Eu reescrevi o script TheSchwa (obrigado TheSchwa!), com estas alterações:

    A detecção de avprobe
  • funciona (pelo menos na versão 2.5.2 do ffprobe a partir da instável Debian atual).
  • Não exclua arquivos com rm (normalmente, os conversores não excluem arquivos, isso pode ser uma grande surpresa!).
  • Carregar arquivos wma no script.
  • Ajuda ao perder binários.
#!/bin/bash

which ffmpeg > /dev/null || { echo "Install ffmpeg, with 'sudo apt-get install ffmpeg'" >&2; exit 1; }
which avprobe > /dev/null || { echo "Install libav-tools, with 'sudo apt-get install libav-tools'" >&2; exit 1; }

output_format=mp3
file='mktemp'
find . -type f | grep -i wma$ > $file

readarray -t files < $file

for file in "${files[@]}"; do
    out=${file%.wma}.$output_format
    probe='avprobe -show_streams "$file" 2>/dev/null'

    rate='echo "$probe" | grep "^bit_rate" | sed "s:bit_rate=\([0-9]\+\)[0-9]\{3\}::" | head -1'
    ffmpeg -i "$file" -ab "$rate"k "$out"
done
    
por pevik 26.12.2014 / 23:08
1

Nota: o seguinte não se aplica a 15.04, 15.10 ou 16.04

Primeiro:

O ffmpeg está obsoleto em 14.04 de qualquer forma e agora você deve usar avconv .

sudo apt-get install avconv

Use este comando para converter arquivos wma para mp3 recursivamente:

for i in 'find . -type f -name '*.wma''; do avconv -i "$i" "${i/.wma/.mp3}"; done

Depois de verificar a qualidade dos arquivos, você poderá executar este comando para remover ou excluir as versões originais do .wma recursivamente:

for i in 'find . -type f -name '*.wma''; do rm "$i"; done

Próximo:

Veja como usar o comando em um script (chamado "wma2mp3":

sudo nano /usr/local/bin/wma2mp3

copie e cole isso no arquivo:

#!/bin/bash
for i in 'find . -type f -name '*.wma''; do avconv -i "$i" "${i/.wma/.mp3}"; done

Pressione ctrl + o e depois pressione enter para salvar o arquivo e use ctrl + x para sair.

Em seguida, torne o arquivo executável com o seguinte comando:

sudo chmod +x /usr/local/bin/wma2mp3

Agora você pode simplesmente executar o comando wma2mp3 para recursivamente converter todos os arquivos wma para mp3.

Basta fazer o mesmo com o script para apagar todos os arquivos wma e nomeá-lo como você quiser.

BTW, se você quiser apenas converter todos os arquivos no diretório atual (não em todos os outros diretórios recursivos subsequentes), você pode usar este comando:

for i in *.wma; do avconv -i "$i" "${i/.wma/.mp3}"; done

e, claro, para remover apenas os arquivos wma no diretório atual, basta usar este comando:

rm *.wma
    
por mchid 26.12.2014 / 23:32
1

Este é um script bash, usando o paralelo :

#!/bin/bash

parallel -i -j$(nproc) ffmpeg -i {} -acodec libmp3lame -ab 192k {}.mp3 ::: ./*.wma
rename 's/.wma//' *.wma.mp3
    
por Aubin 28.01.2017 / 13:57