FFmpeg コマンド: 初心者から熟練者まで | ffmpeg フィルター (フィルター/フィルター)
FFmpeg コマンド: 初心者から熟練者まで | ffmpeg フィルター (フィルター/フィルター)
このセクションでは主に ffmpeg フィルタを紹介し、一般的に使用されるいくつかのフィルタとその使用方法をリストします。
ffmpeg フィルタには多くの種類があり、これが ffmpeg を学習する際の最も難しい点でもあります。
ffmpeg フィルターの基本的な組み込み変数
変数 | 説明する |
---|---|
t | 秒単位のタイムスタンプ、または入力時間が不明な場合は NAN |
n | フレームの連番を0から入力してください |
位置 | 入力フレームの位置、または不明な場合は NAN |
w | 入力ビデオのフレーム幅 |
h | 入力ビデオフレームの高さ |
ビデオのトリミング
入力画像サイズ: iw * ih、開始座標 (x, y)、トリミングされた出力サイズ: ow * oh。
直接表示:
ffplay -i input.jpg -vf crop=ow:oh:x:y
出力画像:
ffmpeg -i input.jpg -vf crop=ow:oh:x:y output.jpg
中央の領域をサイズ 100 * 100 でトリミングします。
ffmpeg -i input.jpg -vf crop=100:100 output.jpg
中央の領域を入力ビデオの 2/3 にクロップします。
ffmpeg -i input.flv -vf crop=2/3*in_w:2/3*in_h output.flv
中央の領域を入力ビデオの高さの正方形にトリミングします。
ffmpeg -i input.flv -vf crop=out_w=in_h output.flv
または
ffmpeg -i input.flv -vf crop=in_h output.flv
例 1:
ffmpeg -i input.jpg -vf crop=iw/3:ih:iw/3:0 output.jpg
座標 (iw/3, 0) から開始して、幅 iw/3、高さ ih の画像を切り出し、output.jpg という名前を付けて保存します。
入力.jpg:
出力.jpg:
例 2:
ffplay -i input.jpg -vf crop=iw/3:ih/2:0:0
座標 (0, 0) から開始して、幅 iw/3、高さ ih/2 の画像が切り取られて表示されます。
テキストの透かし
動画にテキスト透かしを追加するには、多くの準備が必要です。テキスト フォント処理に関連するファイルが必要です。FFmpeg をコンパイルするときに、FreeType、FontConfig、および iconv をサポートする必要があります。システムに関連フォントが必要です。純粋な文字を追加できます。ウォーターマークを FFmpeg に変換します。サポートには、drawtext フィルターを使用します。drawtext のフィルター パラメーターを見てみましょう。
パラメータ | タイプ | 説明する |
---|---|---|
文章 | 弦 | 文字内容 |
テキストファイル | 弦 | テキストコンテンツを保存するファイル |
箱 | ブール値 | テキスト領域の背景ボックス、デフォルトは false |
ボックスカラー | 色 | フォントエリアブロックの色を表示する |
フォント | 弦 | フォント名、デフォルトは Sans フォントです |
フォントサイズ | 整数 | フォントサイズ |
x と y | 弦 | ビデオの左上隅を開始座標として、テキストの透かしが表示される位置。デフォルトは 0 です。 |
アルファ | 浮動小数点数 | 透明度、値が 0 ~ 1 の浮動小数点数、デフォルトは 1 |
例 1: ビデオの左上隅にテキスト透かしを追加します。
ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':x=20:y=20"
フォントの色を緑色に設定します。
ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':fontcolor=green"
テキストの透かし表示の位置を調整したい場合は、x パラメーターと y パラメーターの値を調整するだけです。
ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':fontcolor=green:x=400:y=200"
透明度を変更します。
ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':fontcolor=green:x=400:y=200:alpha=0.5"
テキストの透かしにボックスを追加し、そのボックスに背景色を追加することもできます。
ffplay -i cuc_ieschool.mkv -vf "drawtext=fontsize=40:fontfile=FreeSerif.ttf:text='hello world':fontcolor=green:box=1:boxcolor=yellow"
効果:
注: フィルタ全体は引用符で囲まれ、各パラメータはコロンで区切られます。
例 2: ウォーターマーク コンテンツとして現地時間を使用する
テキスト ウォーターマークでは、ウォーターマーク コンテンツとして現地時間を使用したい場合があります。これは、ドローテキスト フィルターで特別な使用法を使用して行うことができます。現在の現地時間は、年、月、日、時、分、秒の形式でテキストに表示されます。
ffplay -i cuc_ieschool.mkv -vf "drawtext=fontsize=20:fontfile=FreeSerif.ttf:text='%{localtime\:%Y\-%m\-%d %H-%M-%S}':fontcolor=green:box=1:boxcolor=yellow"
効果:
注: 時間はリアルタイムで表示され、常に変化します。
ffmpeg を使用してトランスコードしてファイルに保存する場合は、-re を追加する必要があります (これは、タイムスタンプに従って透かしを入れることを意味します。トランスコードしているため、1 秒間に複数のフレームが存在し、現在時刻)、そうでない場合は時刻が間違っています。
ffmpeg -re -i input.mp4 -vf "drawtext=fontsize=30:fontfile=FreeSerif.ttf:text='%{localtime\:%Y\-%m\-%d %H-%M-%S}':fontcolor=green:box=1:boxcolor=yellow" output.mp4
シーンによっては、ウォーターマークを定期的に表示するか、ウォーターマークを定期的に表示しないことが必要です。このメソッドは、drawtext フィルターでも処理できます。drawtext を有効と組み合わせて使用します。たとえば、テキスト ウォーターマークは 3 秒ごとに表示されます。
ffplay -i input.mp4 -vf "drawtext=fontsize=60:fontfile=FreeSerif.ttf:text='test':fontcolor=green:box=1:boxcolor=yellow:enable=lt(mod(t\,3)\,1)"
注: ffmpeg を使用してトランスコードしてファイルに保存する場合は、-re を追加する必要があります。そうしないと、時間が間違ってしまいます。
式のリファレンス: FFmpeg ユーティリティのドキュメント 3 式の評価
- lt(x, y): x が y より小さい場合は 1 を返し、それ以外の場合は 0 を返します。x が y より小さい場合は 1 を返し、それ以外の場合は 0 を返します。
- mod(x, y):x を y で割った余りを計算します。x 对 y を取ります。
例 3: マーキー効果
マーキーとは、ビデオ インターフェイス上でテキストの透かしが変動し、水平方向の x、y 座標が mod 式に従って動的に変更されてマーキー効果を実現することを意味します。
ffplay -i input.mp4 -vf "drawtext=fontsize=30:fontfile=FreeSerif.ttf:text='helloworld':x=mod(100*t\,w):y=abs(sin(t))*h*0.7"
効果: テキストの透かしが正弦関数の行に周期的に表示されます。
フォントの透明度とフォントの色を変更します。
ffplay -i input.mp4 -vf "drawtext=fontsize=40:fontfile=FreeSerif.ttf:text='liaoqingfu':x=mod(50*t\,w):y=abs(sin(t))*h*0.7:alpha=0.5:fontcolor=white:enable=lt(mod(t\,3)\,1)"
効果:
画像の透かし
FFmpeg はビデオにテキストの透かしを追加するだけでなく、画像の透かしやビデオ ティッカーなどをビデオに追加することもできます。
ビデオに画像の透かしを追加するには、ムービー フィルターを使用できます。ムービー フィルターのパラメーターについて理解しましょう。
パラメータ | タイプ | 説明する |
---|---|---|
ファイル名 | 弦 | ファイル名を入力します。これには、ファイル、プロトコル、デバイスなどを指定できます。 |
format_name または f | 弦 | 入力ファイルのパッケージ化形式 |
ストリームインデックス | 整数 | 入力ファイルのストリームインデックス番号 |
シークポイントまたはsp | 浮動小数点数 | 入力ストリームの時間位置 |
ストリームまたは | 弦 | 複数の入力ストリームのストリーム情報 |
ループ | 整数 | サイクル |
不連続 | 時差 | タイムスタンプの違いのジッタリングのサポート |
ffmpeg -i input.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=x=10:y=10[out]" output.mp4
パラメータ:
- -i: 元のビデオ ファイルのパス
- 透かし画像のパス: logo.png
- 透かしの位置: (x, y) = (10, 10) <= (左, 上)、左と上から 10 ピクセル
- 出力ファイルのパス:output.mp4
- in: input.mp4 を表します。名前はランダムに決定できます。
- ウォーターマーク: 重ね合わせるロゴ.pngを表し、名前はランダムに決定できます。
画像の透かしの位置を特定するにはどうすればよいですか?
パラメータ | 説明する |
---|---|
メイン_w | ビデオの単一フレームの画像幅 |
main_h | ビデオの単一フレームの画像の高さ |
オーバーレイ_w | ビデオの単一フレームの画像幅 |
main_h | ビデオの単一フレームの画像の高さ |
これに応じて、オーバーレイ パラメーターを次の値に設定して、透かし画像の位置を変更できます。
画像の透かしの位置 | オーバーレイ値 |
---|---|
左上隅 | 10:10 |
右上隅 | main_w-overlay_w-10:10 |
左下隅 | 10:main_h-overlay_h-10 |
右下隅 | main_w-overlay_w-10:main_h-overlay_h-10 |
ヒント: 透かし画像の背景が透明であれば、効果がより良くなります。
同様に、マーキー効果を追加することもできます。
ffplay -i input.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=x=mod(50*t\,main_w):y=abs(sin(t))*h*0.7[out]"
絵の中の絵
ピクチャー・イン・ピクチャーとは、その名の通り、再生中の動画に別の動画を重ねて再生することです。
FFmpeg を使用してストリーミング メディア ファイルを再生する場合、ピクチャ イン ピクチャ エフェクトを使用する必要がある場合があります。
FFmpeg では、複数のビデオ ストリーム、複数のマルチメディア キャプチャ デバイス、および複数のビデオ ファイルをオーバーレイを通じて 1 つのインターフェイスに結合して、ピクチャ イン ピクチャ効果を生成できます。
これまでのフィルターの使用、および将来のフィルターの使用においても、ビデオ操作に関連する処理のほとんどは、特にレイヤー処理と結合シナリオでオーバーレイ フィルターと組み合わせて使用されます。以下でそれについて学びましょう。オーバーレイのパラメータ:
パラメータ | タイプ | 説明する |
---|---|---|
バツ | 弦 | x座標 |
y | 弦 | y座標 |
eof_action | 整数 | 遇到 eof 表示时的处理方式。repeat(值为0):重复前一帧,子画面保存前一帧;endcall(值为1):停止所有的流,主画面和子画面全部停止;pass(值为2):保留主画面,子画面关闭。默认为repeat(值为0) |
shortest | 布尔值 | 值为 true 时,最短的视频终止时全部视频终止。默认值为 false |
format | 整数 | 设置 output 的像素格式。有以下几种格式:yuv420(值为0)、yuv422(值为1)、yuv444(值为2)、rgb(值为3).默认值为yuv420(值为0) |
显示画中画效果:
ffplay -i input.mp4 -vf "movie=sub_320x240.mp4[sub];[in][sub]overlay=x=20:y=20[out]"
图解:
参数:
- [sub]:表示要叠加的子画面
- [in]:表示输入的视频
- [in][sub]overlay=x=20:y=20[out]:表示输入和 sub 子画面叠加,叠加的位置由 x, y 决定,out 表示输出,sub 子画面的名字可以随意修改
效果:
子画面停止退出显示,主画面正常播放:
ffplay -i input.mp4 -vf "movie=sub_320x240.mp4[sub];[in][sub]overlay=x=20:y=20:eof_action=2[out]"
最短的视频播完则整个画面停止播放:
ffplay -i input.mp4 -vf "movie=sub_320x240.mp4[sub];[in][sub]overlay=x=20:y=20:shortest=1[out]"
重新设定子画面尺寸:
ffplay -i input.mp4 -vf "movie=sub_320x240.mp4,scale=640x480[sub];[in][sub]overlay=x=20:y=20[out]"
跑马灯效果:
ffplay -i input.mp4 -vf "movie=sub_320x240.mp4[test];[in][test]overlay=x=mod(50*t\,main_w):y=abs(sin(t))*main_h*0.7[out]"
视频多宫格处理
视频除了画中画显示,还有一种场景为以多宫格的方式呈现出来,除了可以输入视频文件,还可以输入视频流、采集设备等。
从前文中可以看出进行视频图像处理时,overlay 滤镜为关键画布,可以通过 FFmpeg 建立一个画布,也可以使用默认的画布。
如果想以多宫格的方式展现,则可以自己建立一个足够大的画布,下面就来看一下多宫格展示的例子:
ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -i 4.mp4 -filter_complex "nullsrc=size=640x480[base];[0:v] setpts=PTS-STARTPTS,scale=320x240[upperleft];[1:v]setpts=PTS-STARTPTS,scale=320x240[upperright];[2:v]setpts=PTS-STARTPTS, scale=320x240[lowerleft];[3:v]setpts=PTS-STARTPTS,scale=320x240[lowerright];[base][upperleft]overlay=shortest=1[tmp1];[tmp1][upperright]overlay=shortest=1:x=320[tmp2];[tmp2][lowerleft]overlay=shortest=1:y=240[tmp3];[tmp3][lowerright]overlay=shortest=1:x=320:y=240" out.mp4
看到这么长的命令可能已经晕了,其实将命令拆分解析一下就很简单了,对命令进行拆分解析:
ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -i 4.mp4 #所有输入
-filter_complex "nullsrc=size=640x480[base]; #创建了一个base的画面,大小640*480
[0:v] setpts=PTS-STARTPTS,scale=320x240[upperleft]; #视频1命令为upperleft,缩放为320x240
[1:v]setpts=PTS-STARTPTS,scale=320x240[upperright]; #视频2命令为upperright,缩放为320x240
[2:v]setpts=PTS-STARTPTS, scale=320x240[lowerleft]; #视频3命令为lowerleft,缩放为320x240
[3:v]setpts=PTS-STARTPTS,scale=320x240[lowerright]; #视频4命令为lowerright,缩放为320x240
[base][upperleft]overlay=shortest=1[tmp1]; # [base][upperleft]叠加生成[tmp1],upperleft没设置就是叠加在(0,0)位置
[tmp1][upperright]overlay=shortest=1:x=320[tmp2]; #[tmp1][upperright]叠加生成[tmp2],叠加在(320,0)位置
[tmp2][lowerleft]overlay=shortest=1:y=240[tmp3]; #[tmp2][lowerleft]叠加生成[tmp3]
[tmp3][lowerright]overlay=shortest=1:x=320:y=240" #[tmp3][lowerright]叠加生成最终的输出
out.mp4
说明:
- 1.mp4、2.mp4、3.mp4、4.mp4 为文件路径
- out.MP4 为输出文件路径
- 通过 nullsrc 创建 overlay 画布,画布大小 640:480
- 使用[0:v][1:v][2:v][3:v]将输入的 4 个视频流去除,分别进行缩放处理
- 基于 nullsrc 生成的画布进行视频平铺,命令中自定义 upperleft, upperright, lowerleft, lowerright 进行不同位置平铺。
图解:
效果:
フレームの一部に映像がない場合、その背景は緑色で表示されます。次のように: