- [説明]コース学習アドレス:https://ke.qq.com/course/468797
目次
FFmpegフィルター
ビデオトリミング
- ビデオフィルター(フィルター):クロップ
- 入力ビデオフレームの幅と高さを、x値とy値で示された位置から指定された幅と高さにトリミングします。
- xとyは出力の左上隅の座標であり、調整システムの中心は入力ビデオフレームの左上隅です。
- x(左上隅から水平方向のピクセル数)とy(垂直ピクセル数)の計算値がフレームごとに評価されます。xのデフォルト値は(iw-ow)/ 2であり、 yのデフォルト値は(ih-oh)/ 2です。
- オプションのkeep_aspectパラメーターを使用すると、出力SAR(サンプルアスペクト比)が変更され、新しいDAR(表示アスペクト比)が補正されます。
- owの値はohから取得でき、その逆も可能ですが、xとyからは取得できません。これらの値は、owとohの後に実行されるためです。
- xの値はyの値から取得でき、その逆も可能です。
- たとえば、入力ボックスの左3分の1、中央3分の1、右3分の1で、次のコマンドを使用できます。
ffmpeg -i input -vf crop=iw/3:ih:0:0 output ffmpeg -i input -vf crop=iw/3:ih:iw/3:0 output ffmpeg -i input -vf crop=iw/3:ih:iw/3*2:0 output
(1) 裁剪 100x100 的区域,起点为(12,34). crop=100:100:12:34 相同效果: crop=w=100:h=100:x=12:y=34 (2)裁剪中心区域,大小为 100x100 crop=100:100 (3)裁剪中心区域,大小为输入视频的 2/3 crop=2/3*in_w:2/3*in_h (4)裁剪中心区域的正方形,高度为输入视频的高 crop=out_w=in_h crop=in_h (5) 裁剪偏移左上角 100 像素 crop=in_w-100:in_h-100:100:100 (6)裁剪掉左右 10 像素,上下 20 像素 crop=in_w-2*10:in_h-2*20 (7)裁剪右下角区域 crop=in_w/2:in_h/2:in_w/2:in_h/2
- ヒント:ffplayを使用して効果を表示し、最後にffmpegを使用してトリミングします
ffplay-i input -vf crop=iw/3:ih:0:0 output
- FFmpegのフィルターを使用する場合、フィルターの時間関連の組み込み変数を使用できます
- FFmpegフィルターの基本的な組み込み変数
- t は秒単位のタイムスタンプ、または入力時刻が不明な場合はNANです。
- nフレームのシーケンス番号を0から入力します
- 入力フレームの位置、または不明な場合はNAN
- w入力ビデオフレームの幅
- h入力ビデオフレームの高さ
テキスト透かし
- ビデオにテキスト透かしを追加するには、多くの条件があります。
- 関連するドキュメントをフォントライブラリで処理する必要があります。
- FFmpegをコンパイルするときは、FreeType、FontConfig、iconvをサポートする必要があります。
- システムには、関連するフォントライブラリが必要です。
- FFmpegでの純粋な文字透かしの追加は、drawtextフィルターでサポートできます。drawtext のフィルターパラメーターを見てみましょう。
- ビデオの左上隅にテキストの透かしを追加します
ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':x=20:y=20"
- フォントの色を緑に設定します:fontcolor = green
ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':fontcolor=green"
- テキスト透かしの表示位置を調整する場合は、xおよびyパラメーターの値を調整します:x = 400:y = 200
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
- テキストの透かしにボックスを追加してから、ボックスに背景色を追加することもできます:box = 1:boxcolor = yellow
fplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':fontcolor=green:box=1:boxcolor=yellow"
- テキスト透かしが透かしコンテンツとして現地時間を使用することを望みます。これは、drawtextフィルターで特別な使用法を使用して完了することができます。現地の現在時刻は、年、月、日、時、分という形式でテキストに表示されます。そして2番目。
- text = '%{localtime \:%Y \-%m \-%d%H-%M-%S}'
ffplay -i input.mp4 -vf "drawtext=fontsize=60:fontfile=FreeSerif.ttf:text='%{localtime\:%Y\-%m\-%d %H-%M-%S}':fontcolor=gree n:box=1:boxcolor=yellow"
- ffmpegを使用してトランスコードしてファイルに保存する場合は、-reを追加する必要があります 。そうしないと、時間が間違っています。
ffmpeg -re -i input.mp4 -vf "drawtext=fontsize=60:fontfile=FreeSerif.ttf:text='%{localtime\:%Y\-%m\-%d %H-%M-%S}':fontcolor=green:box=1:boxcolor=yellow" out.mp4
- 一部のシーンでは、透かしを定期的に表示する必要があり、透かしは定期的に表示されません。enable= lt(mod(t \、3)\、1)
- このメソッドは、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を追加する必要があります。そうしないと、時間が間違ってしまいます。
- 式のリファレンス:http://www.ffmpeg.org/ffmpeg-utils.html3式の評価
- lt(x、y)xがyより小さい場合は1を返し、そうでない場合は0を返します。
- mod(x、y)xをyで除算した余りを計算します。
- マーキー効果
- x = mod(100 * t \、w):y = abs(sin(t))* h * 0.7
ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='helloworld':x=mod(100*t\,w):y=abs(sin(t))*h*0.7"
- フォントの透明度を変更し、フォントの色を変更します:enable = lt(mod(t \、3)\、1)
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 ストリング 入力パッケージ形式 stream_index、si 整数 入力されたストリームインデックス番号 seek_point、sp 浮動小数点 シーク入力ストリームの時間位置 ストリーム、s ストリング 複数のストリーム入力のストリーム情報 ループ 整数 サイクル 不連続 時差 不安定なタイムスタンプの違いをサポート
- 場合:
ffmpeg -i input.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=x=10:y=10[out]" output.mp4
- 元のビデオファイルのパス:input.mp4
- 透かし画像パス:logo.png
- 透かしの位置:(x、y)=(10,10)<=(left、top)それぞれ左と上から10ピクセル。
- 出力ファイルパス:output.mp4
- main_wビデオシングルフレーム画像幅
- main_hビデオシングルフレーム画像の高さ
- overlay_w透かし画像の幅
- overlay_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
- FFmpegで画像透かしを追加する方法は2つあります。
- 1つは、ムービーを介して透かしファイルのパスを指定することです。
- 1つの方法は、フィルターを介して入力ファイルのストリームを読み取り、透かしとして指定することです。これは、映画の画像ファイルを透かしとして読み取る方法です。
- 画像logo.pngがinput.mp4ビデオに入力され、x座標50とy座標20の位置に表示されます
ffplay -i input.mp4 -vf "movie=logo.png[logo];[in][logo]overlay=50:10[out]"
- ロゴ.png画像の背景色が白なので、やや鈍く表示されます。透かし画像の背景が透明であれば、効果が良くなります。背景色が透明な画像を見つけて、下で試してみてください。
ffplay -i input.mp4 -vf "movie=logo2.png[watermark];[in][watermark]overlay=50:10[out]"
- 表示位置
ffplay -i input.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=10:10[out]" ffplay -i input.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=main_w-overlay_w-10:10[out]" ffplay -i input.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=10:main_h-overlay_h-10[out]" ffplay -i input.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=main_w-overlay_w-10:main_hoverlay_h-10[out]"
- マーキー効果:overlay = x = mod(50 * t \、main_w):y = abs(sin(t))* h * 0.7 [out]
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を使用してストリーミングメディアファイルを処理する場合、ピクチャーインピクチャー効果を使用する必要がある場合があります。
- FFmpegでは、複数のビデオストリーム、複数のマルチメディアキャプチャデバイス、および複数のビデオファイルをオーバーレイを介して1つのインターフェイスに組み合わせて、ピクチャーインピクチャー効果を生成できます。
- 以前のフィルターの使用、および将来のフィルターの使用においても、ビデオ操作に関連する処理のほとんどは、特にレイヤー処理およびシーンのマージで使用される場合、オーバーレイフィルターと組み合わせて使用されます。それについて学びましょう。以下。オーバーレイパラメータを見てみましょう。
パラメータ の種類 説明 バツ ストリング 座標 Y ストリング 座標 eof_action 整数
- eofに遭遇したときの処理方法、デフォルトが繰り返されます
- 繰り返し(値0):前のフレームを繰り返します
- endcall(値は1):すべてのストリームを停止します
- パス(値2):メインレイヤーを保持します
最短 ブール値 最短のビデオを終了するときにすべてを終了します(デフォルトはfalse) フォーマット 整数
- 出力のピクセルフォーマットを設定します。デフォルトはyuv420です。
- yuv420(値は0)
- yuv422(値は1)
- yuv444(値は2)
- rgb(値3)
- パラメータリストからわかるように、主要なパラメータは多くありませんが、実際には、オーバーレイフィルタを使用すると、使用できるパラメータの組み合わせが多く、次のようないくつかの内部変数を使用できます。オーバーレイレイヤーの幅、高さ、座標など。
- ピクチャーインピクチャー効果を表示する
ffplay -i input.mp4 -vf "movie=sub_320x240.mp4[sub];[in][sub]overlay=x=20:y=20[out]" ffplay -i input.mp4 -vf "movie=sub_320x240.mp4[sub];[in][sub]overlay=x=20:y=20:eof_action=1[out]" ffplay -i input.mp4 -vf "movie=sub_320x240.mp4[sub];[in][sub]overlay=x=20:y=20:shortest =1[out]
- スケーリングされたスプライトサイズ:scale = 640x480
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]"
FFmpegビデオマルチグリッド処理
- ビデオのピクチャーインピクチャー表示に加えて、マルチグリッド方式で表示されるシーンもあります。ビデオファイルの入力に加えて、ビデオストリームの入力、デバイスのキャプチャなども可能です。
- 前回の記事からわかるように、ビデオ画像を処理する場合、オーバーレイフィルターがキーキャンバスです。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
- 1.2.3.4.mp4はファイルパス、out.MP4は出力ファイルパス、nullsrcを介してオーバーレイキャンバスを作成します。キャンバスサイズは640:480、[0:v] [1:v] [2:v]を使用します。 [3:v] 4つの入力ビデオストリームを削除し、ズーム処理を個別に実行してから、nullsrcによって生成されたキャンバスに基づいてビデオをタイル化します。コマンドで、左上、右上、左下、右下をカスタマイズして、さまざまな位置にタイルします。
- 左上と右上のコマンドのみを重ね合わせます。
ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -i 4.mp4 -filter_complex "nullsrc=size=640x480[base];[0:v]setpts=PTSSTARTPTS,scale=320x240[upperleft];[1:v]setpts=PTSSTARTPTS,scale=320x240[upperright];[base][upperleft]overlay=shortest=1[tmp1];[tmp1][upperright]overlay=sho rtest=1:x=320" out2.mp4