Transcodificação mass .flac -> .mp3: Como escrever um script de shell que preserva as informações da etiqueta ID3?

9

Nas últimas semanas, passei de uma abordagem bastante prática para a transcodificação .flac -> .mp3, para uma que é muito mais 'definir e esquecer'.

A primeira etapa foi parar de usar um front end da GUI (Audacity com um plug-in LAME) e, em vez disso, usar o método descrito aqui .

A segunda etapa foi encontrar um script do shell bash que dissesse que o loop de comando funcionasse recursivamente, permitindo que diretórios com muitos subdiretórios contendo arquivos .flac fossem transcodificados em uma única etapa. Essa resposta foi fornecida por um usuário no askubuntu.com.

Agora, quero aprender a refinar ainda mais as coisas para que as informações da etiqueta ID3 sejam preservadas. Os métodos vinculados aos dados da etiqueta ID3 da faixa acima, deixando o mínimo necessário (ou seja, apenas o campo do título permanece).

Alguém pode me ensinar como escrever um script de shell?


O script de shell foi atualizado assim:

#!/bin/bash
file="$1"
flac -cd "$file" | lame --preset fast extreme - "${file%.flac}.mp3"
id3cp "$file" "${file%.flac}.mp3"

Fazer find . -name '*.flac' -exec ~/bin/flac2mp3 '{}' \;em ~ / Desktop / stack fornece a seguinte saída:

01 - Amon Tobin - Chomp Samba.flac: done         
LAME 3.98.4 64bits (http://www.mp3dev.org/)
Using polyphase lowpass filter, transition band: 19383 Hz - 19916 Hz
Encoding <stdin> to ./01 - Amon Tobin - Chomp Samba.mp3
Encoding as 44.1 kHz j-stereo MPEG-1 Layer III VBR(q=0)
Parsing ./01 - Amon Tobin - Chomp Samba.flac: done.  Copying to ./01 - Amon Tobin - Chomp Samba.mp3: done

id3info para o original .flac e o resultante .mp3 fornece, respectivamente:

*** Tag information for 01 - Amon Tobin - Chomp Samba.flac

(ou seja, nada);

*** Tag information for 01 - Amon Tobin - Chomp Samba.mp3
*** mp3 info
MPEG1/layer III
Bitrate: 128KBps
Frequency: 44KHz

O .flac definitivamente possui informações sobre tags. Eu posso verificar isso abrindo o EasyTAG. EasyTAG se refere a isso como 'FLAC Vorbis Tag', mas 'ID3 Tag' para o .mp3. Esse é o problema?

boehj
fonte
Você já tentou usar ffmpeg?
Hello71
Não, eu não tenho. Nunca realmente o usei antes na CLI para ser honesto. Alguém me contou sobre esse script Perl. Vou tentar isso amanhã e relatar como é tarde agora.
boehj

Respostas:

7
#!/bin/sh

file="$1"
outfile=${file%.flac}.mp3

eval $(metaflac --export-tags-to - "$file" | sed "s/=\(.*\)/='\1'/")

flac -cd "$file" | lame --preset fast extreme \
        --add-id3v2 --tt "$TITLE" --ta "$ARTIST" --tl "$ALBUM" \
        --ty "$DATE" --tn "$TRACKNUMBER" --tg "$GENRE" \
        - "$outfile"
Kambus
fonte
Obrigado Kambus! Isso praticamente faz o truque. A maioria das tags que eu quero agora está lá, após a transcodificação: título, álbum, artista, ano, número da faixa. O campo do CD (1/1, 1/2, etc.) não passou e nem o campo para o 'Número da faixa de '. Mas isso realmente não me incomoda. Curiosamente, eu tentei esse script em um diretório que contém músicas do 'Trip Hop'. As tags foram mantidas intactas, mas o script mudou o Gênero de 'Trip Hop' para 'Trip-Hop'. Então eu acho que ele depende de um banco de dados de gêneros conhecidos lá. Muito obrigado mais uma vez pela sua contribuição!
boehj
@pedrogent: Estou feliz por poder ajudar! Você pode verificar manualmente quais são as outras tags com "metaflac --export-tags-to - file" e usá-las da mesma maneira que $ TITLE e as outras, mas o problema é que não há campos equivalentes para elas no id3 AFAIK. Talvez você possa colocá-los na tag de comentário. Sim, há uma lista predefinida de gêneros: link
Kambus
Olá Kambus. Sim, acho que parte do problema aqui é que não há um 'padrão' claro para os dados de tags ID3. A tag Comment é interpretada de maneira muito diferente de jogador para jogador (ou não existe). Seu script é incrível. Obrigado novamente.
boehj
1

Como usar mp3fs para codificar em massa flac para mp3

Em vez de usar um programa para converter arquivos flac em mp3, você pode usar o mp3fs para apresentá-los como mp3 virtual e um programa que pode enfileirar trabalhos de cópia. Funciona maravilhosamente bem para mim.

Baixe e instale mp3fs e ultracopiadora:

sudo apt-get install mp3fs ultracopier

Crie um par de diretórios flac e mp3 para cada mp3fs que você deseja executar. Eu tenho um processador dual core, então eu corro dois. Se você mantiver os diretórios flac na partição onde estão seus arquivos flac, poderá movê-los rapidamente. Essa partição é chamada "Armazenamento" no meu sistema.

cd /media/Storage
mkdir mp3fs mp3fs/flac_1 mp3fs/mp3_1 mp3fs/flac_2 mp3fs/mp3_2

Você pode montar os diretórios na linha de comando ou adicionando-os a /etc/fstab. Você também pode configurar o algoritmo de taxa de bits e codificação dos mp3 virtuais no momento da montagem. Quero mp3's com uma taxa de bits constante de 320kbps, e o coxo pode levar todo o tempo necessário para produzir o melhor mp3 possível.

Na linha de comando:

mp3fs -b 320 -oquality=0 /media/Storage/mp3fs/flac_1 /media/Storage/mp3fs/mp3_1 -o allow_other,ro
mp3fs -b 320 -oquality=0 /media/Storage/mp3fs/flac_2 /media/Storage/mp3fs/mp3_2 -o allow_other,ro

Se o fusível reclamar, como

fusermount: falha ao abrir /etc/fuse.conf: permissão negada
fusermount: opção allow_other apenas permitida se 'user_allow_other' estiver definido em etc / fuse.conf

remova o comentário da user_allow_otheropção /etc/fuse.confe / ou torne-a legível com

sudo chmod 644 /etc/fuse.conf

Ou de /etc/fstab:

mp3fs#/media/Storage/mp3fs/flac_1 /media/Storage/mp3fs/mp3_1 fuse user,ro,allow_other,bitrate=320,quality=0 0 0
mp3fs#/media/Storage/mp3fs/flac_2 /media/Storage/mp3fs/mp3_2 fuse user,ro,allow_other,bitrate=320,quality=0 0 0

Depois de adicionar os diretórios /etc/fstab, você pode montá-los usando

sudo mount -a

Feito! Comece a ultracopiadora. Ele colocará um ícone indicador no painel do gnome ou o que você usar. Clique nele, selecione adicionar cópia. Eu fiz isso duas vezes para usar dois núcleos. Use seu navegador de arquivos para mover alguns flacs para flac_1. Navegue até o diretório mp3_1 e arraste seus mp3s para uma das janelas da geleira para iniciar uma fila de cópias. O Ultracopier solicitará o destino dos arquivos. Agora você tem um núcleo ocupado codificando um lote de flacs para mp3.

Para usar o outro núcleo, mova os arquivos flac para flac_2 e arraste os mp3 de mp3_2 para a segunda janela da ultracopiadora.

Atualização: em vez de ultracopiadora, agora estou usando o MiniCopier, é um pouco mais fácil de usar. Veja os comentários abaixo.

Arjan Drieman
fonte
Parece haver um erro na lista de diretórios com versões recentes do mp3fs e do fusível: sourceforge.net/tracker/…
Ophidian
@ Ophidian: Interessante. Fiz alguns testes em algumas máquinas usando diferentes distribuições. Eu os tinha funcionando, dentro de um minuto cada, sem erros. A versão mp3fs que estou usando é a mesma, 0,30. Eu usei os kernels 2.3.38, 2.3.39 e 3.0.0, libfuse versões 2.8.4 e 2.8.6. O libfuse mencionado nos relatórios de bugs é 2.8.5. Isso não é o suficiente para concluir que o fusível é o culpado, no entanto, pode valer a pena tentar uma versão diferente se você tiver problemas ao usar o 2.8.5. Você tentou mp3fs? Em qual kernel e com qual libfuse? Você encontrou algum problema?
Arjan Drieman
Em vez de ultracopiadora, agora estou usando o MiniCopier , é um pouco mais fácil de usar. É um aplicativo java, não requer instalação, mas precisa de um JRE. Tem um ícone de cesta e um ícone de caixa. Você pode arrastar uma ou mais fontes de um gerenciador de arquivos para o ícone da cesta, um diretório de destino para o ícone da caixa, e é tudo o que você precisa fazer para adicionar um trabalho de cópia à fila. O MiniCopier possui uma guia separada para itens com falha. O MiniCopier usa menos ciclos de CPU do que a ultracopiadora, 1% vs 3% no meu sistema. Isso pode salvar 12 minutos em uma fila de 10 horas ;-)
Arjan Drieman
Se você deseja uma fila de cópias baseada em shell, encontrei uma solução no superusuário . Sem ajustes, você não poderá executar duas filas com ele e não tenho certeza do que isso fará com os erros.
Arjan Drieman
0

id3cpnão pode funcionar, pois o FLAC não usa ID3; ele usa tags Vorbis.

avconvtem uma opção para manter as tags por meio da conversão. É meio inconstante, seu valor depende da combinação de codecs , mas funciona assim no seu caso (versão 9.16-6):

avconv -i in.flac -map_metadata 0:g:0 out.mp3

A aplicação de todos esses arquivos FLAC em uma pasta (recursivamente) é tão fácil quanto isto: (usando bash)

for f in */**/*.flac; do
  avconv -i "${f}" -map_metadata 0:g:0 "`echo "${f}" | sed -e s/flac$/mp3/`";
done

Observe que avconvusa o coxo automaticamente; existem outras opções para controlar a qualidade e outros enfeites. Verifique se man avconvhá detalhes.

Rafael
fonte