ffmpegでh.264 .MP4ビデオファイルをスマートにトリミング


2

ライブキャプチャされたh.264ビデオを入力として使用し、黒からフェードアップで開始し、できるだけ少ないエンコードで黒へのフェードで終了するようにトリムします。これらのフェードイン/アウトポイントは、Iフレームの間にある場合があります。再エンコードせずに非Iフレームでトリミングすることはできません。

図を作成しました:

ここに画像の説明を入力してください

入力ファイルを3つの部分に分割します。パートAは、ポイント1の前のIフレームで始まり、ポイント1で終わります。パートCは、ポイント2のIフレームで始まり、黒へのフェード後の次のIフレームで終わります。それらはすべてIフレーム形式に再エンコードされます。これらの2つのセグメントは10〜30秒と比較的短くなります。パートB(ビデオのほとんど)は、codec:copyを使用してトランスコードできます。

パーツAおよびCは(黒検出を使用して自動的に、または手動で)トリミングされ、その後、ffmpegを使用してビデオ全体が連結されます。

ffmpegを使用したいのは、それが私が最もよく知っていることであり、私のワークフローの残りの部分では排他的に使用されるからです。どのコマンドラインでこれを達成できますか?

好奇心が強い人のために、ライブビデオをエンコードされたセグメントにキャプチャするためのコマンドラインを次に示します。この時点から、不要なビデオを破棄し、トリミングに必要な場合はセグメントを再エンコードするのは簡単です。最後のステップは、セグメントを連結することです。

ffmpeg -f dshow -rtbufsize 702000k -video_size 1920x1080 -framerate 29.97 -pixel_format uyvy422 -i video="Decklink Video Capture":audio="Decklink Audio Capture" -threads 0 -c:v libx264 -s 1280x720 -crf 18 -profile:v main -level 3.1 -pix_fmt yuv420p -c:a libvo_aacenc -b:a 128k -ac 1 -f segment -segment_time 0.01 -reset_timestamps 1 seg%02d.mp4

29.97正確に置き換えることができ30000/1001ます。
ギャン

回答:


1

これは、セグメントマルチプレクサと連結デマルチプレクサを使用して実現できます。

ステップ1入力をセグメント化します

キャプチャしたソースから抽出00:50したいとします02:20。GOPサイズが3秒だとしましょう。インポイントはGOPの最後のフレームである可能性があるため、1 GOPだけ早く開始する必要があります。したがって、トリムインはisで00:47、抽出期間は01:33です。そう、

ffmpeg -ss 0:57 -t 01:33 -i input.mp4 -c copy -f segment -segment_time 0.01 -reset_timestamps 1 seg%02d.mp4

これにより、各GOPの長さのセグメントが作成されます。したがって、イントラコード化されたストリームにはこれを使用しないでください:)

ステップ2ヘッドセグメントとテールセグメントをトリミングする

GOPの長さが短い場合に可能性のある頭と尾のスーパーフロースセグメントを削除します。次に、正しい上部および尾部セグメントをトリミングします。

ffmpeg -ss 2 -i seg00.mp4 -crf 18 -map [v] -map [a] seg00a.mp4

ffmpeg -t 2 -i seg46.mp4  -crf 18 -map [v] -map [a] seg46a.mp4

ステップ3連結

a) concatファイルを準備するsegments.txt

file 's00a.mp4'
file 's01.mp4'
file 's02.mp4'
...
file 's44.mp4'
file 's45.mp4'
file 's46a.mp4'

b)

ffmpeg -f concat -i segments.txt -c copy -fflags +genpts trimmed.mp4

ライブキャプチャで作業しているため、最終出力を除き、MP4ではなくTSに出力できます。


まず、迅速な対応に感謝します!これを理解していない場合は修正してください。しかし、これが私がやろうとしていることを行うかどうかわかりません。フェードインとフェードアウトを既存のものにトリムしようとしています。私のソースビデオのインとアウトは非常にきつい場合があります。セグメント化はまだ助けになるかもしれません、そして私は今それを読んでいます。ありがとう!
HGBells

次に、ステップ2のフェードフィルターをスキップします。編集したコマンドを参照してください。
ギャン

編集:気にしない、わかりました。これはうまくいくと思います!
HGBells
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.