
真ん中の約 30 秒間だけ左右に反転される 3 分間の短いクリップがあります。
したがって、全体を左から右に反転すると、次のコードを適用したくなります。
ffmpeg -i 3min.mp4 -vf hflip flipped_3min.mp4
しかし、部分的にしか反転されていないので、単一の ffmpeg コマンドで、その hflip フィルターの時間セグメント (1:30-2:00) を適用する方法はありますか?
これに関するドキュメントを探しているのですが、そのようなものは見つかりません。FFmpeg では不可能なのかどうか疑問に思っています。
答え1
を使用してビデオのサブセクションのみを反転するにはどうすればよいですかffmpeg
?
ここ、-filter_complex
hflip
は、フィルタリングされた入力のチェーンを作成できるため、非常に便利です。フィルターグラフでは、質問で言及されているフィルターを引き続き使用します。
次のようにサブセクションに適用できます。
ffmpeg -i input.mp4 -filter_complex "[0:v]trim=start=0:duration=90[a];\
[0:v]trim=start=90:duration=30,setpts=PTS-STARTPTS[b];\
[b]hflip[c];\
[a][c]concat[d];\
[0:v]trim=start=120:duration=60,setpts=PTS-STARTPTS[e];\
[d][e]concat[out1]" -map [out1] flip.mp4
簡単にコピー + 貼り付けできる 1 行:
ffmpeg -i input.mp4 -filter_complex "[0:v]trim=start=0:duration=90[a];[0:v]trim=start=90:duration=30,setpts=PTS-STARTPTS[b];[b]hflip[c];[a][c]concat[d];[0:v]trim=start=120:duration=60,setpts=PTS-STARTPTS[e];[d][e]concat[out1]" -map [out1] flip.mp4
説明:
フィルターグラフを使うことはアクションの連鎖を作ることに少し似ています。これについては、「フィルタリング入門」セクションフィルターのドキュメントを参照してください。フィルターは入力- これはフィルターの前に表示されるビットです。たとえば、[0:v]
(最初の入力ストリームのビデオ) または[a]
(作成された出力a
) です。出力つまり、入力または入力に従って変換されfilter
、出力または出力。
ここには簡単なアクションのセットがあり、これを順番に実行すると、入力と出力のフィルターグラフを構築できます。
セグメント
以下を使用して、ビデオの 3 つのセグメント (入力から[0:v]
)を作成しますtrim
。
- 最初のセグメント(90秒)は何もしない(として出力
[a]
) - 2 番目のセグメント (30 秒) で、
hflip
継続setpts
時間の問題を回避するために (出力を としてトリムし[b]
、それをhflip
として出力に渡します[c]
)
これら2つをconcat
組み合わせて出力を作成します[a]+[c] -> [d]
(期間:120秒)
- 3番目のセグメント(60秒)、PTSを再度設定します(出力として
[e]
)
セグメントを結合して出力を作成し[d] + [e] -> [out1]
、-map
それをファイル内の最終出力にします。
これにより、オリジナルと同じ長さ (180 秒) のビデオが作成されますが、中間の 30 秒間のセクションが水平に反転されます2。
1 :
視覚的表現ffmpeg
フィルターのドキュメント
では
libavfilter
、フィルタは複数の入力と複数の出力を持つことができます。どのようなことが可能かを説明するために、次のフィルタグラフを考えます。
[main]
input --> split ---------------------> overlay --> output
| ^
|[tmp] [flip]|
+-----> crop --> vflip -------+
このフィルターグラフは、入力ストリームを 2 つのストリームに分割し、1 つのストリームをクロップ フィルターと vflip フィルターに通してから、そのストリームを他のストリームの上に重ねてマージします。
2テスト済みffmpeg version N-72939-g5b0f55a
答え2
一部のフィルターは、オプションを有効にする。
フィルターのリストが表示され、タイムラインがサポートされているかどうかは で確認できます。フィルター名の前のffmpeg -filters
「T
」は、タイムライン編集をサポートしていることを示します。必要なフィルターにタイムラインがサポートされていない場合は、ffmpeg
フィルターが更新されてこれをサポートすることがあるため、 を更新してください。それ以外の場合は、他の回答で説明されているように、トリム フィルターを使用します。
ffmpeg
例:
ffmpeg -i input -vf "hflip=enable='between(t,90,120)'" -c:a copy output
ffplay
例:
ffplay -vf "hflip=enable='between(t,90,120)'" input