テレビの録画や古い DV カメラの映像をパソコンで再生すると、横方向に細かい縞模様(コーミング)が出ることがあります。インターレース方式の映像を、そのまま表示していることが原因です。FFmpeg の yadif フィルタでプログレッシブ方式に変換すると、縞模様は消えます。

インターレースとは

インターレースは、1フレームを奇数番目の横の線(フィールド1)と偶数番目の線(フィールド2)に分けて、交互に表示する方式です。テレビ放送(NTSC・PAL)や DV カメラの録画でよく使われています。

今のパソコンやスマートフォンの画面は、1フレームをまとめて表示するプログレッシブ方式です。そのため、インターレース映像をそのまま再生すると縞模様が出ます。

基本コマンド

ffmpeg -i input.mp4 -vf yadif output.mp4

yadif は、何も指定しないと mode=0(入力の1フレームごとに1フレームを出力)で動きます。

mode オプション

ffmpeg -i input.mp4 -vf "yadif=mode=0" output.mp4
mode値 動作 フレームレート
0 各フレームを1フレームに変換 変化なし
1 各フィールドを1フレームに変換 2倍になる
2 mode=0 と同じ。ただし空間方向のインターレース検査を省く 変化なし
3 mode=1 と同じ。ただし空間方向のインターレース検査を省く 2倍になる

ふつうは mode=0 で十分です。mode=1 は、60i(インターレース)を 60p にしたいときに使います。インターレースの印が付いたフレームだけを処理したいときは、mode ではなく deint=1 を指定します。

60i → 30p への変換

日本のテレビ放送(1080i・60Hz)を 30p にする例です。mode=0 はフレームの数を変えないので、出力はそのまま 30p(正確には 29.97p)になります。

ffmpeg -i input.mp4 -vf "yadif=mode=0" output.mp4

60i → 60p への変換

ffmpeg -i input.mp4 -vf "yadif=mode=1" output.mp4

mode=1 では、フィールドごとに1フレームを出力します。そのため、60fps のプログレッシブ映像になります。

parity オプション(フィールド順の指定)

ffmpeg -i input.mp4 -vf "yadif=mode=0:parity=0" output.mp4

parity は、2つのフィールドのどちらを先に表示するかの指定です。

parity値 説明
-1 自動検出(デフォルト、推奨)
0 TFF(Top Field First)— 1080i の HD 映像に多い
1 BFF(Bottom Field First)— DV カメラの映像(NTSC・PAL とも)に多い

ふつうは -1(自動)のままで大丈夫です。

インターレース映像の見分け方

インターレースかどうかは、ffprobe で確かめられます。

ffprobe -v quiet -show_streams -select_streams v:0 input.mp4 | grep field_order

結果が tt(TFF)、bb(BFF)、tb、bt のどれかなら、インターレース映像です。progressive と出ても、ファイルにそう記録されているだけで、映像に縞が残っていることがあります。縞が見えるときは、idet で映像そのものを調べてください(「よくある質問」を参照)。

高品質なインターレース解除(yadifの代替)

bwdif(Bob Weaver Deinterlacing Filter)は、yadif をもとに作られた、より高画質なフィルタです。何も指定しないと mode=1(フィールドごとに1フレーム)で動くので、フレームレートが2倍になります。yadif の基本コマンドと同じく1フレームから1フレームを出すには、mode=0 を指定します。

ffmpeg -i input.mp4 -vf bwdif=mode=0 output.mp4

実測: 処理時間とサイズ

計測したコマンドは次のとおりです。

ffmpeg -i input.mp4 -vf yadif=mode=0:parity=-1 -c:v libx264 -crf 23 -preset medium -an output.mp4
項目 実測値
処理時間 14 秒(実時間の 8.57 倍速)
出力サイズ 67.94 MB
フィルタなし再エンコードとのサイズ差 -21.2%

計測環境: Core i9-14900KF(32スレッド)/ FFmpeg 8.1 (gyan.dev)、2026-09-05、各コマンドを1つずつ順に実行。素材は 1920x1080・30fps・120秒・351.4 MB(Big Buck Bunny をループしたもの、CC BY 3.0)です。入力には、この素材を FFmpeg の interlace フィルタで 1080i のインターレース映像にして再エンコードしたファイルを使いました。interlace は2フレームを1フレームにまとめるので、このファイルは 15fps・1800 フレームです。比べる対象として、元の素材(30fps・3600 フレーム)をフィルタなしで再エンコードした場合(-c:v libx264 -crf 23 -preset medium のみ)は 27.97 秒・86.26 MB でした。全データはデータセットで公開しています。

なぜこの数字になるのか

フィルタなしの再エンコード(27.97 秒)の約半分の 14 秒で終わったのは、エンコードしたフレームが半分だったからです。mode=0 の yadif は1フレームから1フレームを出すので、出力も 15fps・1800 フレームです。1フレームあたりにすると、フィルタなしが約 7.8 ミリ秒(27.97 秒 ÷ 3600)、yadif ありも約 7.8 ミリ秒(14 秒 ÷ 1800)で、ほぼ同じでした。yadif を足しても、時間はほとんど増えていません。

出力が 21.2% 小さいのも、フレームが半分だからです。1フレームあたりのデータ量は、フィルタなしの再エンコードの約 1.6 倍でした。

インターレース解除は、-c copy(再エンコードせずにコピーする指定)ではできません。同じ計測で、映像を再エンコードしない操作は、ストリームの選択が 0.41 秒、moov アトムの移動が 0.49 秒、映像はコピーして音声だけを再エンコードする音声フェードが 1.03 秒で終わりました。映像を再エンコードする操作は、フィルタなしで 27.97 秒、VP9 への変換で 729.16 秒かかりました。フィルタを使うと必ず再エンコードになるので、コピーのように1秒前後では終わりません。

mode=1 で 60p にする場合は、出力するフレームが増えるので、この数字は当てはまりません。計測したのは mode=0 だけです。

解除できたかどうかは、横に流れるテロップ、人の腕、スポーツのボールなど、速く動くものの輪郭を見るとわかりやすいです。parity が逆だと、動きが前後に行ったり来たりするように見えます。その場合は、短い区間で parity=0 と parity=1 を試して比べてください。

関連記事

よくある質問

yadif、bwdif、nnedi、どれが一番良い?

bwdif は yadif をもとに改良したフィルタです。nnedi(ニューラルネットワークを使う方式)はいちばん高画質ですが、遅いです。yadif も、大量のファイルをまとめて処理する用途なら十分です。

60i を 30p と 60p どちらに deinterlace する?

60p(mode=1:フィールドごとに1フレーム)のほうが、動きがなめらかです。30p(mode=0)はフレームレートが半分なので動きがカクカクして見えますが、Web 配信には合っています。

映像がインターレースかどうか先に判定したい

できます。ffmpeg -i in.mp4 -filter:v idet -frames:v 200 -f null - を実行すると、最初の 200 フレームを解析して、BFF・TFF・progressive と判定したフレームの数を表示します。インターレースと判定された数がプログレッシブより多ければ、インターレース解除をかけます。

プログレッシブ素材を deinterlace すると劣化する?

少し劣化します。インターレース解除のフィルタは、足りないフィールドをぼかしや複製で埋めるからです。先に idet で調べて、インターレースと確かめられた映像にだけ使ってください。

deinterlace で解像度は変わる?

変わりません。出力の縦横の大きさは入力と同じで、変わるのはフィールドの合わせ方だけです。1080i(1920×1080 のインターレース)なら、出力は 1920×1080 のプログレッシブになります。