Converta .flac para .mp3 com ffmpeg, mantendo todos os metadados

88

Como posso converter .flac para .mp3 com ffmpeg, mantendo todos os metadados (ou seja, convertendo o comentário Vorbis em arquivos .flac para metadados ID3v2 de .mp3)?

Vito Gentile
fonte
5
Observe que, da próxima vez, você deve fazer ffmpegperguntas sobre o uso do cli no Superusuário . Stack Overflow é apenas para questões envolvendo programação. Além disso, o FLAC suporta oficialmente apenas comentários Vorbis , então presumo que você queira converter para ID3v2 em vez de "manter".
llogan
Ok, resolvi minha pergunta. Eu perguntei aqui porque vi perguntas como essa no StackOverflow (por exemplo, isso ou isso ) e presumi que seria interessante compartilhar meu conhecimento. Além disso, vejo que há uma tag ffmpeg , então por que não compartilho minha solução aqui? O ffmpeg é usado em muitos aplicativos por muitos desenvolvedores.
Vito Gentile
3
A tag ffmpeg diz, "Perguntas sobre o uso interativo da ferramenta de linha de comando FFmpeg devem ser feitas no Superusuário.". Não é grande coisa, mas eu só queria apontar isso, já que há muitas perguntas fora do tópico aqui na minha opinião.
llogan

Respostas:

152

O comando a seguir mantém a alta qualidade em .mp3 (320 kbps) e os metadados do arquivo .flac são convertidos para o formato ID3v2, que pode ser incluído em arquivos .mp3:

ffmpeg -i input.flac -ab 320k -map_metadata 0 -id3v2_version 3 output.mp3
Vito Gentile
fonte
1
É importante notar que "ffmpeg" pode precisar ser substituído por "avconv".
shockburner
5
O FWIW ffmpeg3.2 copia automaticamente os metadados para ID3v2 do FLAC sem a necessidade de especificar -map_metadata 0 -id3v2_version 3, embora não copie para tags ID3v1. Eu uso uma ferramenta separada para isso.
Dai
1
as letras ainda não são copiadas
user151496
1
Ele divide flac se houver várias partes?
Artyom
1
@Artyom Você provavelmente deve ter o arquivo cue junto com seu flac, onde os pontos de divisão estão marcados. Se sim, você pode usar shnsplit (console) ou flacon (GUI) para dividir seu arquivo e converter as partes para mp3. Se você tiver apenas um flac, poderá escrever uma cui para ele ou usar as opções -ss e -t do ffmpeg para cortar cada música.
56

Resposta perfeita acima. Eu o uso junto com o find para adicionar todos os arquivos FLAC em uma subárvore ao iTunes com este comando

find . -name "*.flac" -exec ffmpeg -i {} -ab 160k -map_metadata 0 -id3v2_version 3 {}.mp3 \;

Para adicionar automaticamente os arquivos resultantes ao iTunes, obtenha o diretório de importação do iTunes com

find ~/Music/ -name "Automatically Add*"

resultado, por exemplo

/Users/sir/Music//iTunes/iTunes Media/Automatically Add to iTunes.localized

Em seguida, execute por exemplo

find . -name "*.mp3" -exec mv {} "/Users/sir/Music//iTunes/iTunes Media/Automatically Add to iTunes.localized/" \;

Para adicionar automaticamente todas as faixas convertidas ao iTunes.

user2707001
fonte
3
" / Usuários / senhor ", lmao.
Harry Svensson
Anedota: todos os usuários em nossa empresa têm nomes de estrelas, abreviados para 3-5 caracteres. O meu é "sirius", curto senhor;)
user2707001
Opção não reconhecida 'nome'.
MonsterMMORPG
14

Se você quiser economizar um pouco de espaço, experimente a recomendação do hydrogenaud.io :

Muito alta qualidade: HiFi, casa, ou escuta calma, com melhor tamanho do arquivo -V0 (~245 kbps), -V1 (~225 kbps), -V2 (~190 kbps)ou -V3 (~175 kbps)são recomendados. Essas configurações VBR normalmente produzirão resultados transparentes. Podem existir diferenças audíveis entre essas predefinições, mas são raras.

Fonte: http://wiki.hydrogenaud.io/index.php?title=LAME

Se você quiser usar esta opção no ffmpeg, você deve usar o -q:a 0alias.

Controle a qualidade com -qscale:a(ou o alias -q:a). Os valores são específicos do codificador, portanto, para libmp3lame, o intervalo é 0-9, onde um valor inferior é uma qualidade superior. 0-3 normalmente produzirá resultados transparentes, 4 (padrão) deve ser próximo à transparência perceptual e 6 produzirá uma qualidade "aceitável". A opção -qscale:aé mapeada para a -Vopção na ferramenta de interface de linha de comando lame independente.

Fonte: https://trac.ffmpeg.org/wiki/Encode/MP3

Se você quiser metatags ID3v1 também, deverá adicionar o -write_id3v1 1parâmetro.

Portanto, meu comando final é:

ffmpeg.exe -y -i input.flac -codec:a libmp3lame -q:a 0 -map_metadata 0 -id3v2_version 3 -write_id3v1 1 output.mp3
wiktor
fonte
8

Eu estava testando o seguinte comando para converter o infile.flacarquivo em outfile.mp3:

ffmpeg  -i infile.flac  -q:a 0  outfile.mp3

No Ubuntu 16.04, o comando acima parece copiar (a maioria? Todos?) Os metadados.

-q:a 0diz ffmpegpara usar o VBR de mais alta qualidade.

No entanto, ffmpegestava transcodificando a arte do meu álbum de jpegpara png, o que aumentou o tamanho da capa.

Stream mapping:
  Stream #0:1 -> #0:0 (mjpeg (native) -> png (native))
  Stream #0:0 -> #0:1 (flac (native) -> mp3 (libmp3lame))

(Acho que a conversão acima faz sentido, dado como ffmpegfunciona .)

Depois de pesquisar um pouco, encontrei a -c:v copyopção que especifica que o stream de vídeo deve ser copiado, em vez de transcodificado. O comando completo é:

ffmpeg  -i infile.flac  -c:v copy  -q:a 0  outfile.mp3

O comando acima resulta em:

Stream mapping:
  Stream #0:1 -> #0:0 (copy)
  Stream #0:0 -> #0:1 (flac (native) -> mp3 (libmp3lame))
mpb
fonte
3

Para converter recursivamente em mp3 todos os arquivos flac em pastas aninhadas, usei este comando:

find '~/Music/' -iname '*.flac' -exec bash -c 'D=$(dirname "{}"); B=$(basename "{}"); mkdir "$D/mp3/"; ffmpeg -i "{}" -ab 320k -map_metadata 0 -id3v2_version 3 -acodec libmp3lame "$D/mp3/${B%.*}.mp3"' \;

Ele criará uma pasta chamada "mp3" dentro daquela com os arquivos flac e, dentro da pasta mp3, salvará os arquivos mp3 relativos com uma taxa de bits de 320kbps, sem manter a extensão do arquivo antigo no nome.

Riccardo Volpe
fonte
3

One-liner para converter todos os .flacarquivos .mp3em um único diretório, mantendo a maioria dos metadados:

for file in *.flac; do ffmpeg -i $file -q:a 0 ${file:r}.mp3; done

(Nota: ${file:r}remove a extensão do caminho de arquivo fornecido)

ffmpeg: flac para mp3

woudsma
fonte
Basta citar a variável $filecomo "$file".
Chazy Chaz
:rparece ser um zshmodificador, que não funciona em bash. No Bash, você pode substituir "${file:r}.mp3"por "${file%.flac}.mp3".
mivk
para mostrar apenas o nome do arquivo do arquivo, em uso bash${file%.*}
Evhz
2

Eu sei que isso não foi perguntado, mas considerando que uma das razões pelas quais isso é feito (pelo menos é o que eu queria fazer) é para que a música possa ser importada para o iTunes da Apple que não suporta FLAC. Nesse caso, faz mais sentido converter FLAC para o formato sem perdas da própria Apple, m4a. Usei este comando para converter todos os arquivos na pasta atual, mantendo tamanhos de arquivo semelhantes.

find . -name "*.flac" -exec ffmpeg -i {} -map_metadata 0 -acodec alac {}.m4a \;

Dhiraj Gupta
fonte
Opção não reconhecida 'nome'. Erro ao dividir a lista de argumentos: Opção não encontrada
MonsterMMORPG
@MonsterMMORPG você provavelmente esqueceu de digitar o. após o comando find. O . diz a find para procurar na pasta atual e -name diz a ele para procurar nomes de arquivo correspondentes.
Dhiraj Gupta
2

Este script flac2mp3.sh usa ffmpegpara converter uma árvore de pastas de arquivos FLAC em outra árvore de pastas de arquivos MP3. A arte da capa está incluída, quando presente. Você pode definir uma CORESvariável para criar trabalhos em segundo plano para converter vários arquivos de uma vez.

Rick O'Sullivan
fonte
retorna o erro sed: -e expressão # 1, caractere 26: comando `s 'não
terminado
Exatamente o que eu estava procurando, obrigado!
Ajustei