YouTube will not accept an audio file. Here is the free way to wrap it in a video โ a still image or a moving waveform โ and the export settings that stop your audio being re-encoded into mush.
Every route below produces the same thing: an MP4 with your audio intact and something to look at. The difference is how much work it is for one track versus two hundred.
ffmpeg is free, runs on Mac, Windows and Linux, and does this in one command. Install it, put your image and audio in the same folder, and run:
ffmpeg -loop 1 -i cover.jpg -i track.mp3 \
-c:v libx264 -tune stillimage -pix_fmt yuv420p \
-c:a aac -b:a 320k \
-shortest -movflags +faststart output.mp4
What each part is doing:
| Flag | Why it matters |
|---|---|
-loop 1 | Repeats the still image so it lasts as long as the audio |
-tune stillimage | Tells the encoder the picture never changes โ much smaller file |
-pix_fmt yuv420p | Without this, some players and phones show a black screen |
-b:a 320k | Upload better audio than you need; YouTube re-encodes, so give it headroom |
-shortest | Ends the video when the audio ends instead of looping forever |
-movflags +faststart | Moves the index to the front so it starts playing before it's fully loaded |
The most common failure: "width not divisible by 2". H.264 needs even pixel dimensions. Resize your image to 1920ร1080 (or 1080ร1920 for Shorts) and it goes away. Or add -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" to force it.
A moving visual holds attention far better than a static frame, and ffmpeg can generate one from the audio itself โ no editing software:
ffmpeg -i track.mp3 -filter_complex \
"[0:a]showcqt=s=1920x1080:fps=30[v]" \
-map "[v]" -map 0:a \
-c:v libx264 -pix_fmt yuv420p -c:a aac -b:a 320k \
-movflags +faststart output.mp4
showcqt renders a musical-note spectrum, which tracks melody rather than just volume โ it reads as intentional rather than as a generic bouncing bar meter. showwaves and showfreqs are the alternatives if you prefer a classic waveform.
To put the waveform over your artwork rather than on black, overlay it:
ffmpeg -loop 1 -i cover.jpg -i track.mp3 -filter_complex \
"[1:a]showcqt=s=1920x300:fps=30[w]; \
[0:v]scale=1920:1080[bg]; \
[bg][w]overlay=0:H-h[v]" \
-map "[v]" -map 1:a -c:v libx264 -pix_fmt yuv420p \
-c:a aac -b:a 320k -shortest -movflags +faststart output.mp4
| Tool | Good for | Catch |
|---|---|---|
| CapCut | One track, quickly, with captions | Manual per track; watermark on some exports |
| Online converters | A single file, no install | Upload limits, re-encoded audio, your file on someone's server |
| DaVinci Resolve | Full control, free | Heavy install for what is a one-line job |
| Canva | Nice-looking templates | Length caps and slow exports on long audio |
The commands above are fine for one track. For an album, a back catalogue, or a library you post from daily, the work is not the encoding โ it is doing it consistently two hundred times: the same logo placement, the same title card, both a 16:9 and a 9:16 version, correct filenames, nothing silently truncated.
That is a batch job, and it is worth scripting once rather than repeating by hand.
Social Video Factory turns a folder of audio into finished branded videos in bulk โ vertical and horizontal, with your logo, QR code and titles burned in, consistently across every track. A downloadable Claude skill, one purchase.
See how it works