FFmpeg Telecine Filter: How to Apply 3:2 Pulldown

This guide explains how to convert progressive 24 fps (or 23.976 fps) video into 29.97 fps interlaced video using the telecine video filter in FFmpeg. You will learn the mechanics of the 3:2 pulldown cadence, the essential parameters required by the filter, and how to execute a complete encoding command that outputs a broadcast-compliant interlaced stream.

Understanding 3:2 Pulldown in FFmpeg

The 3:2 pulldown process adapts 24-frame-per-second film material to standard 29.97 fps (59.94 fields per second) television systems. The telecine filter achieves this by breaking progressive frames into fields and alternating their display duration. One frame is displayed across two fields, and the subsequent frame is displayed across three fields, creating the standard "2-3-2-3" cadence.

The Telecine Filter Syntax

The FFmpeg filter uses two primary parameters:

  • first_field: Sets the field dominance. Use top (or t) for top-field first, or bottom (or b) for bottom-field first. Top-field first is standard for HD and modern broadcast workflows.
  • pattern: Specifies the cadence sequence of field lengths. The value 23 creates standard 3:2 pulldown (alternating 2 fields and 3 fields).

The basic filter call is:

telecine=first_field=top:pattern=23

Full Encoding Command

When applying the telecine filter, you must also instruct your video encoder to preserve and properly flag the interlaced structure.

Here is a standard command using the libx264 encoder:

ffmpeg -i input_24p.mp4 -vf "telecine=first_field=top:pattern=23" -c:v libx264 -flags +ilme+ildct -top 1 -c:a copy output_2997i.mp4

Parameter Breakdown

  • -i input_24p.mp4: Specifies the progressive 23.976 fps or 24 fps input source.
  • -vf "telecine=first_field=top:pattern=23": Executes the 3:2 pulldown, expanding the frame rate to 29.97 fps (if input is 23.976 fps) or 30 fps (if input is 24 fps).
  • -c:v libx264: Selects the H.264 video codec.
  • -flags +ilme+ildct: Forces interlaced motion estimation and interlaced discrete cosine transform, preventing the encoder from smoothing away interlaced field boundaries.
  • -top 1: Flags the encoded video stream metadata as top-field first (TFF). Set to 0 for bottom-field first (BFF).
  • -c:a copy: Copies the audio stream without re-encoding.

Verifying the Stream

Confirm that the output has the correct frame rate and interlaced field flagging using ffprobe:

ffprobe -v error -select_streams v:0 -show_entries stream=r_frame_rate,field_order output_2997i.mp4

The output should confirm an r_frame_rate of 30000/1001 (for standard NTSC 29.97 fps) and a field_order of tt (top-coded, top-displayed).