Using ffmpeg to convert audio cassettes to videos

The excellent ffmpeg is the swiss army knife of all video processing. Just as a reminder to myself, here's a command line to convert an image and audio file to a video.

ffmpeg -y -loop 1 -framerate 1  -i image.jpg  -i Unknown.mp3 \
    -c:v libx264 -preset medium -tune stillimage -crf 23 \
    -vf scale=-1:720 -c:a copy -shortest -pix_fmt yuv420p \
    -movflags +faststart output.mp4

The options are as follows:

  • -y Yes, go ahead and overwrite output file. Useful when experimenting.
  • -loop 1 Loop input stream 1. Makes the single image last forever as a stream.
  • -framerate 1 Set video frame rate to 1FPS. This saves space. But going below 1 FPS causes compatibility issues with some players.
  • -c:v libx264 Encode video as h.264 using the excellent x264 library. Good quality, great compatibility.
  • -preset medium Use medium quality settings for video encoder. Other options: ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow. No need to go overboard for still images.
  • -tune stillimage Tune the video encoder for a still image.
  • -crf 23 Video quality/bitrate. Values of 18 - 25 are reasonable. Lower values give higher quality and bitrates.
  • -vf scale=-1:720 Scale the video image to 720 pixels of height, preserving aspect ration. Adjust to your needs.
  • -c:a copy Copy the audio stream without re-encoding it.
  • -shortest Finish encoding when the shortest input stream ends. Since we made the image stream infinite with -loop 1, the audio stream is the shortest.
  • -pix_fmt yuv420p Use yuv pixel format for better compatibility.
  • -movflags +faststart Arrange all the mp4 headers and stuff at the beginning of the file so that it can be streamed efficiently.

Optionally you may use -c:a aac -b:a 192k instead of -c:a copy to re-encode audio as AAC, which is more common in the mp4 container.

So there you go...

Show Comments