Video Conversion

Creating a Streamable MP4

Convert to Y4M
  • 16×9
  • 480p

First, take the original source and extract the video to a YUV4MPEG container. At the same time, choose the new aspect ratio and video size.

avconv -i source.mp4 -s hd480 -aspect 16:9 source.y4m
x264 Y4M

Next, use x264 to reencode the video. By default, x264 uses the medium preset. Use a constant bitrate for encoding the video, so that the stream is a smooth experience, and the software can accurately predict the download to delivery ratio.

  • medium preset (default)
  • high profile h264
  • two-pass encoding
  • constant bit rate
x264 --preset medium --profile high --pass 1 --bitrate 1000 --vbv-bufsize 2000 -o video.264 source.y4m
x264 --preset medium --profile high --pass 2 --bitrate 1000 --vbv-bufsize 2000 -o video.264 source.y4m

When you're happy with the outcome, you can come back and re-encode the video at a higher quality rate.

x264 --preset placebo --profile high --pass 1 --bitrate 1000 --vbv-bufsize 2000 -o video.264 source.y4m
x264 --preset placebo --profile high --pass 2 --bitrate 1000 --vbv-bufsize 2000 -o video.264 source.y4m
AAC audio re-encode

Next, source the original audio to WAV so that we can re-encode it at the target bit rate, which is also fixed. This also discards any container issues that the original may have had.

  • Source to WAV
  • WAV to AAC
avconv -i source.mp4 audio.wav
avconv -i audio.wav -b 96k audio.m4a
MP4 Muxing (MP4box)

Next, use MP4Box to join the audio and video together, as well as specify the exact framerate, and setting the interframe rate to a smaller value than normal to also aid streaming.

mp4box -add video.264 -add audio.m4a -fps 25 -inter 500 mp4box.mp4
qt-faststart

Finally, move all the metadata about the MP4 to the front of the file, so that clients can know about the souce material.

qt-faststart mp4box.mp4 qt.mp4