2016-10-11 16 views
1

私はFFmpegがビデオをトリミングする方法にかなり悩まされています。だから誰かが私を助けることができたら本当に感謝します。 基本的には、私がやっていることは次のとおりです。私はビデオシーケンスを持っていて、ある秒間に停止し、一時停止のようなイメージを数秒間フリーズしてから、同じ正確なフレームから再現します。 A.mp4(ビデオシーケンスの最初の部分)、B.mp4(フリーズされた画像)、C.mp4(ビデオシーケンスの2番目の部分)の3つのビデオを扱っていると言えるでしょう。また、filter_complexでオーバーレイを実行します。FFmpeg - 高精度でトリミングするには?

静止画からビデオを生成する部分は問題ではありません。私の主な関心事は、ビデオを正確にトリムして連結する方法を見つけることです。他の投稿やソースから、私はFFmpegがKeyframesであるフレームからトリムすることを発見しました。これは強制できます。しかし、私のビデオAは、の先頭とは別のフレームで終了するので、私が得た結果は適切ではありません。

私が使用していたコマンドは次のようなものです:

ffmpeg -y -i VideoSequence.mp4 -c:v libx264 -pix_fmt yuv420p \ 
-force_key_frames "expr: gte(t,n_forced * 15)" -t 30 VideoOut.mp4 

は、私の知る限りでは

たビデオを[フィルタ・コンプレックス内のすべてが正常に動作オーバーレイ、約であることに注意してください] 15秒ごとにKeyframeが必要です。今、私は2部(「第二の15の前に」と「第二の15後」)にビデオをカットする:前述のように

ffmpeg -y -ss 00:00:01 -i VideoOut.mp4 -t 14 -c copy A.mp4 

ffmpeg -y -ss 00:00:15 -i VideoOut.mp4 -t 5 -c copy C.mp4 

、私はA.mp4の終わりは始まりに「一致」することを期待します(フレーム精度で)C.mp4のものですが、私が得た結果は完全ではありません。

ご協力いただきありがとうございます。

+0

これはlibav-tools用の本当のffmpegまたはDebianラッパーですか、どのバージョンですか? – OrangeDog

+0

'-filter_complex'のような、問題に関連しないものを削除して、[mcve]を与えることもできますか? – OrangeDog

+0

@OrangeDogが編集されました。アドバイスをいただきありがとうございます。 Btw、それは、バージョンN-81696-gd38dff8eのffmpegです。 – DSalenga

答えて

0

フレームレートが定義されていないため、キーフレームが正しく挿入されていない可能性があります。代わりに15フレーム毎1を強制的に、ちょうどあなたが必要とする2を挿入します。

-force_key_frames 00:00:01,00:00:15 

それとものみ分割がきれいではなく、分割が落ちる場所を正確に、あなたはセグメントミュクサー使用できることを気にしている場合:

-f segment -segment_time 14 out%03d.mp4 

このdocumentationに関するもう一つのアイデア:

-ss 位置を(入力/アウトput)
入力オプション(-iの前)として使用する場合は、この入力ファイルを検索して配置します。ほとんどのフォーマットでは正確に探すことができないので、ffmpegはの位置の前に最も近いシークポイントを探します。トランスコードと-accurate_seekが有効になっている場合(デフォルト)、シークポイントと位置の間の余分なセグメントがデコードされ、破棄されます。ストリームコピーを行うとき、または-noaccurate_seekが使用されるとき、それは保存されます。

出力オプション(出力ファイル名の前)として使用すると、タイムスタンプがデコードされてからタイムスタンプが到達するまで入力が破棄されます。

したがって、-ssを移動しても差はありませんが、特に正確なシークがない旧バージョンの場合は試してみる価値があります。

+0

お時間をありがとうございます@OrangeDog。しかし、それは動作していないようです:最初のトリムは正しく実行されますが、2番目の部分の先頭が最初の部分の終わり(オーディオとビデオの両方)と重なっています。私は-iの前後に-ssを置こうとしましたが、どちらの場合も結果は正しくありません。 – DSalenga

+0

私が言ったように、私は違いはありませんが、キーフレームはどこに落ちるのでしょうか? – OrangeDog

+0

他の2つのアイデアはどうですか? – OrangeDog

3

最終目標がであると仮定します。ある秒で停止し、数秒間(一時停止のような)画像をフリーズしてから、同じ正確なフレームから再現します。では、複数のビデオ世代を有する現在の方法は、不必要に無駄である。

ここでは、ビデオが25 FPSであると仮定して、1つのコマンドで実行する方法を示します。ここで

ffmpeg -i original.mp4 -filter_complex 
     "[0]split[a][b]; 
     [a]trim=1:15,loop=75:1:349,setpts=N/FRAME_RATE/TB[pre]; 
     [b]trim=15,setpts=N/FRAME_RATE/TB[post]; 
     [0]atrim=1:15,asetpts=N/SR/TB[apre]; 
     [0]atrim=15,asetpts=N/SR/TB[apost]; 
     [pre][apre][post][apost]concat=a=1[v][a]" 
     -map "[v]" -map "[a]" paused.mp4 

はフィルターグラフで何が起こっているかです:

まず、ビデオは二つの同一のストリームに分割されています。その後、第1ストリームは、第2の開始から15秒の終わりまでトリミングされる。ループフィルタでは、1(最後のフレーム)#349で始まるフレームが75フレーム繰り返されます。トリムまたはループフィルタはそうしないので、タイムスタンプは正規化されます。 2番目の分割ストリームは、16番目の秒から開始するようにトリムされ、そのタイムスタンプはリセットされ、2つのストリームは連結を使用してジョイントされます。ジョイントストリームの上に何かをオーバーレイする必要がある場合は、concatの後にoverlayフィルタを挿入します。

+0

私は別の質問があります:フレームを一時停止するのではなく、同じ画像をいくつかの線や色で表示したい場合はどうしますか?ありがとう! – DSalenga

+0

コンカットの後に、(t、14,17) 'の間で' enable = 'を使用して、オーバーレイされた部分の上に新しいイメージをオーバーレイするオーバーレイフィルタを追加します。' – Mulvya

+0

もう一度ありがとう! – DSalenga

関連する問題