Dockerized ffmpeg video conversion

Easily convert large .MOV files to a compressed VP9 format using the jrottenberg/ffmpeg docker image.

Code

# Replace the following:
#  * Mounted directory (mine is /tmp/ff)
#  * Source filename (mine is is MVI_7493.MOV)
#  * CRF (quality) value - I used 30
# First pass output.webm
docker run -it \
    --mount type=bind,source=/tmp/ff,target=/tmp/workdir \
    --rm \
    jrottenberg/ffmpeg \
    -y \ 
    -i /tmp/workdir/MVI_7493.MOV \
    -c:v libvpx-vp9 -b:v 0 -crf 30 \
    -pass 1 \
    -f webm \
    /dev/null

# Second pass
docker run -it \
    --mount type=bind,source=/tmp/ff,target=/tmp/workdir \
    --rm \
    jrottenberg/ffmpeg \
    -y \
    -i /tmp/workdir/MVI_7493.MOV \
    -c:v libvpx-vp9 -b:v 0 -crf 30 \
    -pass 2 \
    -f webm \
    output.webm

File size

1.5G May  9 21:23 MVI_7493.MOV
2.2M May  9 23:09 ffmpeg2pass-0.log
121M May 10 02:18 output.webm

The conversion took about 3 hours. The original is 1.5GB, the temporary log file is 2.2M, and the output is 121M.

Discussion

My Canon 550d DSLR saves video files using the h264 format. The video files are quite big - 4.5 minutes take about 1.5 GB, and I want to share a smaller version in a royalty-free format.

I am not a professional video editor, so I decided to avoid the complexity of ffmpeg installation on my Mac and choose a proper Docker container instead. Julien Rottenberg’s image seemed like a great choice - popular, starred, and its crazy Dockerfile is exactly what I was trying to avoid doing myself.

I took some digging into the Dockerfile to understand the mount point (which is /tmp/workdir), and from that point it’s pretty much running the ffmpeg commands.

Two pass

Quoting the manual:

Two-pass is the recommended encoding method for libvpx-vp9 as some quality-enhancing encoder features are only available in 2-pass mode.

In Two-pass mode, the first pass creates a temporary log file, and the second pass uses the log file and the original video to generate the final output. The only difference between the first and second pass commands are the output file (/dev/null in the first pass) and the -pass 1, -pass 2 arguments respectively.

Links

Written on May 9, 2019