Converter recursivamente em subdiretórios
Aqui está uma find
versão simples que converte tudo .mp3
no 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 ffmpeg
reclamar 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 libx264
reduz 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 avectorscope
está 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.
-vcodec libx264
reduz drasticamente o aumento do tamanho do vídeo em relação ao MP3: superuser.com/a/1472572/128124