Image sequence into Matroska/FFV1

Problem

Transcode an image sequence into an FFV1 file wrapped in a Matroska container.

Solution

ffmpeg \
    -f image2 \
    -framerate 24 \
    -i input_file_%06d.ext \
    -c:v ffv1 \
    -level 3 \
    -coder 1 \
    -context 1 \
    -g 1 \
    -slices 24 \
    -slicecrc 1 \
    -c:a copy \
    output_file.mkv

General command

ffmpeg \
    -f image2 \
    -framerate frames_per_second \
    -i input_file_regex.ext \
    -c:v ffv1 \
    -level 3 \
    -threads nb_threads \
    -coder 1 \
    -context 1 \
    -g 1 \
    -slices 24 \
    -slicecrc 1 \
    -c:a copy \
    output_file

Command syntax

ffmpeg
starts the command
-f image2
forces the image file de-muxer for single image files
-framerate frames_per_second
sets the frame rate
-i input_file_regex.ext
path, name and extension of the input files
-c:v ffv1
The video codec FFV1 is selected.
-level 3
The version 3 of FFV1 is selected.
-threads nb_threads
This positive integer gives the number of threads to use while processing. Adjust this to match how many of the available CPU cores you want to use.
-coder 1
The Range coder is selected.
-context 1
The large context is selected.
-g 1
The GOP-size 1 is selected for archival use.
-slices nb_slices
Valid values are 4, 6, 9, 12, 16, 24 or 30. Each frame is split into this number of slices. This affects multithreating performance, as well as filesize: increasing the number of slices may speed up performance, but also increases the filesize.
-slicecrc switch
0 = off, 1 = on. Enabling this option adds CRC information to each slice. This makes it possible for a decoder to detect errors in the bitstream, rather than blindly decoding a broken slice.
-c:a copy
re-encodes the audio stream using the same audio codec
output_file
path, name and extension of the output file

Discussion

The parameters witch apply to the input files must precede them. Therefore the option -f image2 must precede the image sequence given as input.

The frame rate of sound film is 24 fps (frames per second) and the default frame rate of image2 is 25 fps, therefore we have to change it.

The regex %06d matches six digits long numbers, possibly with leading zeroes. This allows to read in ascending order, one image after the other, the full sequence inside one folder. The command must of course match the naming convention actually used. And for image sequences starting at 086400 (captured at 24 fps with a timecode starting at 01:00:00:00) or at 090000 (captured at 25 fps with a timecode starting at 01:00:00:00), add the flag -start_number 086400 or -start_number 090000 before -i input_file_%06d.ext.

The extension for TIFF files is .tif or maybe .tiff; the extension for DPX files is .dpx (or eventually .cin for old Cineon files). Other file formats are possible.

The video codec is specified by -codec:video, which is usually abbreviated as -c:v (-codec:v or -c:video are also possible). We advise to avoid the alias -vcodec.

We advise to use only the version 3 of FFV1 in production, because the version 1 is deprecated, the version 2 has never really existed, and the version 4 is currently under development.

 

A Bash script allowing to perform this transcoding is included in our collection Bash Script for Audiovisual Preservation.


2020–08–13