Como converter MP3 para o formato de vídeo permitido pelo YouTube?

8

Eu tenho muitos arquivos MP3 no meu site e decidi enviá-los para o Youtube, mas infelizmente para mim, o YouTube não me permite fazer isso. Requer apenas o formato de vídeo.

Como posso converter esses MP3s em vídeo e adicionar o mesmo conjunto de imagens (uma ou mais imagens) ao formato de vídeo resultante.

Preciso fazer isso em massa, não individualmente, tenho centenas de arquivos MP3.

Pode ser um aplicativo baseado em Windows ou Linux.

malhobayyeb
fonte

Respostas:

9

Há algumas informações sobre o uso do FFmpeg para codificar áudio com uma imagem parada para o YouTube, aqui , e alguns conselhos para fazer conversões em massa no Windows, aqui .

Quanto à codificação, acho que isso funciona:

ffmpeg -loop 1 -r 1 -i pic.jpg -i audio.mp3 -c:a copy -shortest -c:v libx264 output.mp4

A -c:v libx264codificação reduz consideravelmente o tamanho do arquivo de saída, conforme mencionado em: https://superuser.com/a/1472572/128124

Mica
fonte
Descobri também que a adição -vcodec libx264reduz drasticamente o aumento do tamanho do vídeo em relação ao MP3: superuser.com/a/1472572/128124
Ciro Santilli Enviado em 20/08/08
@CiroSantill Sim, essa é uma solução muito melhor. Eu atualizei a resposta.
slhck
@slhck obrigado por confirmar! Eu editei para adicionar também um link à minha resposta como atribuição :-)
Ciro Santilli 中心 改造 中心 996ICU 六四 事件
3

Você também pode considerar o bash oneliner simples em vez do script python -

for i in *.mp3; do ffmpeg -v quiet -i "picture.jpg" -i "$i" -shortest -acodec copy "`sed 's/mp3/mp4/g'<<<$i`"; done

Isso converterá todos os arquivos mp3 no seu diretório atual em vídeos mp4 com picture.jpg.

Para converter flac para mp3 que seria

for i in *.flac; do ffmpeg -v quiet -i "$i" -ab 320k -ac 2 -ar 48000 "`sed 's/flac/mp3/g'<<<$i`"; done

Observe "-v quiet" , que fecha a boca alta do ffmpeg e também aspas duplas em torno de $ ie sed- isso garantirá que não falhe com nomes de arquivos que contenham espaços.

Uma dica: converter para vídeo leva bastante tempo (pelo menos para mim). Tente usar -threads 4 (ou qualquer outro valor, é claro. Não fará sentido na CPU de núcleo único)

Edit: Eu descobri que "-loop 1" (sugerido por outros) cria loop (que surpreendente!), Que é realmente infinito. No meu gentoo, isso significa que ele comerá todas as suas mordidas saborosas. Sem o "-loop 1", ele funciona muito bem, então eu sugiro que você faça isso.

kecer
fonte
2

Existem algumas soluções para o Ubuntu e outros sistemas Linux em http://ubuntuforums.org/showthread.php?t=1686664 . A maioria são comandos de shell ou alguma outra linguagem de script rápida que pode ser executada em loop para todos os MP3s, produzindo arquivos de vídeo. Em seguida, você pode simplesmente enfileirar os arquivos de vídeo para enviar para o YouTube. Entre as soluções listadas na página:

  1. FFmpeg, faça o upload de arquivos para o YouTube
    ffmpeg -loop 1 -i picture.jpg -i music.mp3 -shortest -acodec copy video.mp4 Loop de acordo com todos os arquivos mp3 e, em seguida, faça o upload de todos os arquivos de vídeo resultantes.

  2. Python, converta para mp4 e depois envie arquivos para o YouTube

    #! /usr/bin/env python

    import sys, os

    inputOne = sys.argv[1] inputTwo = sys.argv[2]

    for i in sys.argv[1:]: if '.mp3' in i: output = i.replace('mp3','mp4')

    cmd = 'ffmpeg -loop_input -i "'+inputOne+'" -i "'+inputTwo+'" -shortest -acodec copy "'+output+'"'

    os.system(cmd)

Ele também usa ffmpeg e aceita música e imagem como argumentos.

Caleb Xu
fonte
loop_inputestá obsoleto no ffmpeg - você precisa usar -loop 1agora.
slhck
Podemos ter mais de uma imagem na primeira solução (1. FFmpeg)?
Rasoul
1

Converter recursivamente em subdiretórios

Aqui está uma findversão simples que converte tudo .mp3no diretório atual e seus subdiretórios para mp4:

find . -iname *.mp3 | sort | while IFS="" read -r f; do
  ffmpeg \
    -nostdin \
    -loop 1 \
    -r 1 \
    -i image.jpg \
    -i "$f" \
    -vcodec libx264 \
    -acodec copy \
    -shortest \
    "$(basename "${f%.*}.mp4")" \
  ;
done

Obtenha alguns dados de teste:

wget -O image.jpg https://upload.wikimedia.org/wikipedia/commons/8/83/Lama_Portrait_06072007_01.jpg
wget -O audio.ogg https://upload.wikimedia.org/wikipedia/commons/4/4f/BackUpAndPush.ogg
ffmpeg -i audio.ogg audio.mp3

Saída carregada: https://www.youtube.com/watch?v=tv3a6kP6BDA

Se ffmpegreclamar que o tamanho da imagem não é múltiplo de 2 (necessário libx264), primeiro você pode encontrar o tamanho da imagem com o Imagemagick:

identify image.jpg

e depois arredondar a largura e a altura para ficarem uniformes, por exemplo, se o tamanho fosse 1023x513, usaríamos:

 convert image.jpg -resize 1024x512! imag2.jpg

onde as !forças desse tamanho serão usadas: https://unix.stackexchange.com/questions/319504/force-graphicsmagick-to-resize-image-to-specific-width

A -nostdiné necessária porque ffmpeg lê bytes do stdin de outro modo, e quebra o nosso read!!! https://stackoverflow.com/questions/52374260/bash-variable-changes-in-loop-with-ffmpeg

A -vcodec libx264reduz drasticamente o tamanho do vídeo final a ser muito mais próximo ao do MP3 original: o codec de vídeo padrão parece ser muito pior. Pode ser possível reduzir ainda mais o aumento do tamanho, tendo menos quadros-chave: https://stackoverflow.com/questions/30979714/how-to-change-keyframe-interval-in-ffmpeg Nos dados de nossa amostra, tivemos +3 MB em um MP3 de 3 minutos e 3 MB com uma imagem de 1,1 MB.

Consulte também: Combine uma imagem + um arquivo de áudio para criar um vídeo usando o FFmpeg

Representação processual de vídeo de áudio

O ffmpeg é muito abrangente e você pode gerar várias representações de vídeo do seu áudio usando os comandos do formulário:

ffmpeg -i audio.mp3 \
  -filter_complex "[0:a]avectorscope=s=1920x1080,format=yuv420p[v]" \
  -map "[v]" -map 0:a avectorscope.mp4

Aqui avectorscopeestá o tipo de representação específico.

Aqui está uma lista útil desses formatos: https://gist.github.com/seyoum/4455e9bed74241bfbd640a8083fd38b3, todos documentados em: http://ffmpeg.org/ffmpeg-filters.html#Multimedia-Filters

Consulte também: Crie um arquivo de vídeo a partir de um arquivo de áudio e adicione visualizações do áudio

Testado no Ubuntu 19.04, ffmpeg 4.1.3. Os arquivos foram enviados corretamente para o YouTube a partir de agosto de 2019.

Ciro Santilli adicionou 996ICU à lista
fonte
Eu não recomendaria usar o AVI como contêiner de saída. Use o MP4. Também para dimensionamento, você pode usar o scalefiltro no ffmpeg, por exemplo, stackoverflow.com/a/40497904/435093
slhck
@slhck obrigado por esta informação. Eu ainda tenho que
entender
11
Veja superuser.com/a/300997/48078
slhck em
-2

Copie seus arquivos mp3 (ou o que você quiser codificar, altere seu formato de áudio de acordo.) Para uma pasta. Coloque também uma instância de ffmpeg, com uma imagem de capa intitulada herringbone.jpg.

Em seguida, vá para o CMD e navegue até a pasta.

Copie isto:

for %a in (*.mp3) do "ffmpeg" -loop 1 -r 1 -i "Herringbone.jpg" -vcodec mpeg4 -i %a -acodec copy -shortest %a".mp4"

(Para colar na janela CMD, clique na janela da linha cmd no canto superior esquerdo. Escolha EDIT / Paste.)

Pressione Enter.

Funciona com a versão mais recente do codificador ffmpeg (4.1.1)

Eu imagino que você também pode alterar o formato do vídeo. Basta mudar de mp4 para o que você deseja e o que o ffmpeg suporta.

Encontrei isso em outro fórum, mas não funcionou até que eu mudei de lugar -shortestno script.

Antti Luode
fonte
"Também coloque uma instância de ffmpeg nela ..." Essa é uma recomendação ridícula. FFmpeg é um binário que pode ser executado de qualquer lugar; forçar uma cópia para um diretório específico é um desperdício e excessivamente complexo.
JakeGould 22/08