The audio is required, the picture is optional
Most tools that combine two files hand you two upload boxes. This one has a single box that accepts both lists at once, the audio formats .mp3, .wav, .m4a, .ogg and .flac alongside the picture formats .jpg, .jpeg, .png and .webp, and works out which is which from the extension rather than from the order you added them.
The rule is asymmetric on purpose. Exactly one audio file is required and the run stops without it. At most one image is allowed and zero is perfectly valid, because there is a whole second code path for the no-picture case. So you can drop a song and a cover together, drop the song and add the cover a moment later, or drop the song on its own and pick a color instead.
- Drop your track on the box, or click Choose files. The accepted extensions are printed inside the drop zone.
- For a background picture, add one image too, either in the same drop or afterwards. The file list under the box should end up holding one audio file and at most one picture.
- Pick a Video resolution, either 720p (1280x720) or 1080p (1920x1080).
- With a picture, set Image fit (only used if you upload a background image) to Fit whole image (letterboxed with black bars) or Fill the frame (crops the image). Without one, choose a Background color (only used if you don’t upload an image) from Black, White, Navy blue, Red or Green.
- Click MP3 to MP4 Video Converter and let the percentage run.
- Download the MP4 from the link, with the before and after sizes printed just above it.
The two options you did not use are simply ignored. Picking a background color while an image is loaded changes nothing, and neither does setting a fit mode with no picture present.
A probe pass runs before a single frame is encoded
The tool reads your audio’s duration before it encodes anything, by running FFmpeg once with no output and parsing the duration line out of the log. That number then becomes an explicit duration limit on the real run. If the duration cannot be read, which happens with a truncated or corrupt file, the run stops there rather than guessing.
The obvious alternative would be to tell FFmpeg to stop when the shortest input ends, which is the standard way to pair a looping image with a soundtrack. The comment sitting above that argument builder in the source explains why it is not used here, and it is a nice example of a plausible approach that measurement killed: against the exact WebAssembly build this site loads, pairing a looped image with that flag produced output about 1.7 seconds longer than the audio every single time, at 1, 2, 2.5 and 5 second test inputs, so a fixed overshoot rather than a proportional one. Clamping to the probed duration gave the expected length every time, within the normal few milliseconds of AAC frame rounding. The probe pass exists to pay for that.
Letterboxing against cropping your cover art
With a picture loaded, the choice between the two fit modes is a choice about what you are willing to lose. Cover art is square, video frames are not, and something has to give.
Fit whole image scales the picture until it fits entirely inside the frame and then pads the leftover space with black, centred. Nothing is cropped and nothing is stretched, and for a square image in a 16 by 9 frame you get bars down both sides. Fill the frame scales the other way, until the picture covers the frame completely, and then crops off whatever hangs over the edge. Nothing is bordered and nothing is stretched, but a square image loses its top and bottom. Both graphs finish by forcing square pixels, so no player can decide to stretch the result on its own.
Neither mode ever refuses to enlarge, which is the trap. A 500 pixel avatar is scaled up to 720 or to 1080 and comes out soft, because scaling adds pixels rather than detail. If the only artwork you have is small, 720p treats it more kindly than 1080p does.
The solid color path builds its video out of nothing
Skip the image and the tool does not write a picture into FFmpeg’s virtual filesystem at all. Instead it generates a video source on the fly, a flat field of your chosen color at the chosen resolution and 25 frames per second, and pairs that with your audio. The five colors in the dropdown are real color names the filter understands, passed straight through, and anything the tool does not recognise falls back to black.
This is the path to use for a podcast episode, a lecture recording or a soundboard clip, where a still photo would add nothing. It also encodes fast: a single unchanging color is about the least demanding thing you can hand a video encoder, so almost all of the work is the audio.
Picking 720p or 1080p for wherever this is going
A still image does not benefit from more pixels the way real footage does, so the resolution choice is mostly about what the destination expects rather than about how it looks. 720p is the default and is plenty for a static frame; 1080p is worth choosing when the platform is going to re-encode anyway and you would rather it start from more data, or when your artwork is genuinely large.
Either way, the video stream ends up costing very little, because an encoder handed a frame identical to the one before it has almost nothing to store. On a normal-length track, most of the finished file is the AAC audio at 192 kbps rather than the picture.
What a still image MP4 will not do for you
This is a packaging tool, not a video editor. There is no waveform, no motion, no text and no cut. If what you actually want is something that moves in time with the sound, the audio visualizer takes the same set of audio and image inputs but draws an animated waveform or a scrolling spectrum over the top, with a color theme to pick from. If you already have real footage and only want to change its soundtrack, add audio to video replaces or blends a track into an existing clip instead of inventing a picture for it.
Going in the other direction, MP4 to MP3 pulls the audio back out of a finished video, though note it accepts .mp4 only, so a WEBM would need converting first. The rest of the video tools here handle the trimming, merging and compression that come after this step.