FFmpegがビデオを分割して元に戻す


8

FFmpegを使用して、いくつかのstart_timeend_time入力に基づいてビデオを分割し、それらを他のビデオファイルで置き換えようとしています。たとえば、入力の場合、10 15EXACT秒10 to 15を別のビデオに置き換える必要があります。

OK。私の頭に浮かぶのはこれです:

  1. 最初にビデオを分割します(この場合、0-10、10-15、および15-end)
  2. 10-15を他のビデオに置き換える
  3. すべてのサブビデオをマージして戻す

最初の質問:これは最善かつ最速のソリューションですか?動画内の特定の期間を別の動画に置き換える、より簡単なコマンドやその他のツールはありますか?

2番目の質問:FFmpegが実行可能なソリューションであると仮定すると、単にコマンドを使用するffmpeg -I input.video -ss 10 -t 5 -c copy output.mp4と、ビデオ処理コードでファイルを読み取って処理できません。mediainfoツールを使用して2つのファイルを比較し、ヘッダーサイズの違いに気づきましたが、ビデオコーデックに関連するものはすべて同じでした。HEADER SIZEが異なるため、明らかに問題が発生していることに気づきました。ヘッダーサイズを強制する方法はありますか(コーデックを除く)同じですか?

更新:エミュレータで正常に動作する元の.mp4ファイルは次のとおりです。


最初に、2番目の質問で述べた問題に対処する必要があります。使用している正確なコマンドと、ffmpegから取得した完全な、切り取られていないコマンドライン出力を表示してください。また、ファイルの読み取り時に発生する実際のエラーも表示します。「処理コード」が正確に何であるかを知っているとよいでしょう。
slhck 2017

@slhckビデオ処理コードは巨大なコードベースです。共有できません。何らかの理由で元のファイルは読み込まれますが、再生成されたファイルは読み込まれません。ただし.mp4、必要に応じて元のファイルを共有できます。
アリアナ2017

私はmediainfoツールを使用して2つのファイルを比較し、ヘッダーのサイズなどの違いに気付きました
Ariana

オリジナルを使用することは役立ちますが、それが読み取れない理由をトラブルシューティングすることはできません。それが内部コードである場合、私は恐れています。
slhck 2017

@slhckファイルをアップロードしました。私の質問が更新されました
アリアナ

回答:


9

使用するtrimconcat-ソースファイルを別のコーデックで

このため、個々のファイルが同じ解像度、理想的には同じフレームレートやクロマサブサンプリングなどであることを確認してください。これにより、連結中のエラーやグリッチを防ぐことができます。

trimおよびconcatフィルターを使用して、ファイルを分割せずにすべてを一度に実行できます。

ffmpeg -i edv_g24.mp4 -i short-video.mp4 -filter_complex "\
[0:v]trim=0:10,setpts=PTS-STARTPTS[v0]; \
[1:v]trim=0:5,setpts=PTS-STARTPTS[v1]; \
[0:v]trim=15:30,setpts=PTS-STARTPTS[v2]; \
[v0][v1][v2]concat=n=3:v=1:a=0[out]" \
-map "[out]" output.mp4

ここで、trim0:v1:v後で連結する入力ビデオストリーム(、)の個々の部分を指定するために使用されます。これらのパーツにはから名前が付けられv0ますv2。(setptsフィルターはこれらの個々の部分のタイムスタンプを0にリセットします。これは連結に必要です)。その後、3つの部分を連結します。

特定のタイムスタンプから最後までトリミングtrim=start=15する場合は、範囲を指定する代わりにを使用します。

ファイルにオーディオがある場合は、これらのストリームを個別にトリミングする必要があります。

ffmpeg -i edv_g24_2.mp4 -i short-video.mp4 -filter_complex "\
[0:v]trim=0:10,setpts=PTS-STARTPTS[v0]; \
[0:a]atrim=0:10,asetpts=PTS-STARTPTS[a0]; \
[1:v]trim=0:5,setpts=PTS-STARTPTS[v1]; \
[1:a]atrim=0:5,asetpts=PTS-STARTPTS[v1]; \
[0:v]trim=15:30,setpts=PTS-STARTPTS[v2]; \
[0:a]atrim=15:30,asetpts=PTS-STARTPTS[a2]; \
[v0][a0][v1][a1][v2][a2]concat=n=3:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" output.mp4

この場合、ビデオとオーディオは再エンコードされることに注意してください–適切な出力品質ターゲットを指定してください(例:-crfx264、x265、またはlibvpx-vp9)。これについての詳細は、FFmpeg Wiki(VP9H.264など)で読むことができます。

個別のセグメントを使用する

クリップを分割して後で再構成する場合:

ffmpeg -i edv_g24.mp4 -ss 0 -to 10 -c copy part1.mp4
ffmpeg -i edv_g24.mp4 -ss 10 -to 15 -c copy part2.mp4
ffmpeg -i edv_g24.mp4 -ss 15 -c copy part3.mp4

ffmpeg -i part1.mp4 -i short-video.mp4 -i part3.mp4 -filter_complex \
"[0:v][1:v][2:v]concat=n=3:v=1:a=0[outv]" \
-map "[outv]" -t 30 output.mp4

ファイルに音声が含まれている場合は、上記と同じ方法を使用します。

ffmpeg -i part1.mp4 -i short-video.mp4 -i part3.mp4 -filter_complex \
"[0:v][0:a][1:v][1:a][2:v][2:a]concat=n=3:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" -t 30 output.mp4

これにより、ビデオストリームが再度エンコードされます。もう少し簡単ですが、それ以外の点では上記の方法と同等です。

concatdemuxerの使用

原則として、concat demuxerを使用して、再エンコードせずにビットストリームを連結することもできます。というファイルを作成しconcat.txt、次のエントリを追加します(上記で作成したビデオクリップに対応)。

file 'part1.mp4'
file 'short-video.mp4'
file 'part3.mp4'

次に、これらの個々のファイルを連結します。

ffmpeg -f concat -i concat.txt -c copy output.avi

ただし、これには、クリップのコーデック、解像度、フレームレートなどが同じである必要があるため、すべての種類の異種ソースでは機能しません。

使用するconcatプロトコルを

上記の種類のファイルレベルの連結はconcat、上記と同じ種類の制約(同じコーデック、解像度など)を使用して、プロトコルを使用しても実現できます。

ffmpeg -i "concat:part1.avi|part2.avi|part3.avi" -c copy output.mp4

連結の詳細については、それぞれのFFmpeg Wikiページを参照してください


これは完全に見えます!ありがとう。やってみます!
アリアナ2017

Idk concatメソッドを使用するとエラーがスローされる理由:[concat @ 00000000025c2560] Line 1: unknown keyword 'part1.mp4 \\ text.txt: Invalid data found when processing input
Ariana

「個々のセグメントの使用」については、出力が停止し、小さなカットアウトが見られます。これを修正する方法はありますか?
アリアナ2017

方法1は完全に機能します。1つのこと:特定の数値を指定せずに(30秒ではなく)「終わりまで」を指定するには
Ariana

1
すみません、間違えました。以下のためにconcatデマルチプレクサ、構文が異なっていました。今修正されました。最後まで進むには、を使用してtrim=start=15、トリムフィルターのドキュメントを参照してください:ffmpeg.org/ffmpeg-filters.html#trim-タイミングの問題については、これは実際にはソースマテリアルに依存します。アップロードしたクリップと連結しても問題はありませんでした。
slhck 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.