Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
Convert audio track/album to YouTube video


A recipe to prepare audio file(s) for YouTube upload. Video will be a slideshow of images on repeat.

Requires: imagemagick ffmpeg

  1. Convert images to required size. Here I assume .png files and output to png/ folder. See

for f in *.png; do convert "$f" -resize 800x600 -gravity center -background black -extent 800x600 png/"$f".png; done

  1. Generate video out of pngs. Here each image is shown for 20 seconds. See and

ffmpeg -framerate 1/20 -pattern_type glob -i "png/*.png" -c:v libx264 -vf "fps=25,format=yuv420p" png.mp4

  1. Concatenate audio files. See
printf "file '%s'\n" ./*.flac > files.txt
ffmpeg -f concat -safe 0 -i files.txt files.flac
  1. Concatenate png video enough times to cover audio duration. See for rationale.
for i in {1..10}; do printf "file '%s'\n" png.mp4 >> pngs.txt; done
ffmpeg -f concat -safe 0 -i pngs.txt -c copy pngs.mp4
  1. Create YouTube video using acceptable encoding settings. See

ffmpeg -i pngs.mp4 -i files.flac -shortest -codec:v libx264 -crf 21 -bf 2 -flags +cgop -pix_fmt yuv420p -codec:a aac -strict -2 -b:a 384k -r:a 48000 -movflags faststart youtube.mp4

  1. Generate a YouTube track listing to copy-paste in the video description.

./ *.flac

# Show album track list in YouTube-friendly format including
# clickable track offsets.
# Only works with .flac atm :-(
# Requires: metaflac sox
for f in "$@"
offset=$(date -u -d "0 $start sec" +"%H:%M:%S")
title=$(metaflac "$f" --show-tag=TITLE | sed s/.*=//g)
trackno=$(metaflac "$f" --show-tag=TRACKNUMBER | sed s/.*=//g)
echo "$offset" "$trackno" "$title"
end=$(soxi -D "$f")
start=$(bc -l <<< "$start + $end")

This comment has been minimized.

Copy link
Owner Author

@infojunkie infojunkie commented Aug 22, 2016

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment