Cut video with ffmpeg. – Stack Overflowより、再エンコードなしに1行のコマンドで先頭と後ろをカットする方法。
コマンドプロンプトでは問題ないが、PowerShellで実行すると標準出力の部分が出力終わるまで入力に渡さないので出力が失敗する。
開始10秒と後ろ10秒をカットしてその間をコピー出力する。同じファイルを2度入力するのでファイル名に注意。
ffmpeg -ss 10 -i video.mp4 -ss 20 -i video.mp4 -c copy -map 1:0 -map 0 -shortest -f nut - | ffmpeg -f nut -i - -map 0 -map -0:0 -c copy out.mp4
- このコマンドの挙動の理解には-shortest、-map、-f nutを知る必要がある
- -shortestは複数入力のトラックの中から一番短いファイル時間でカットされる
- 1番目の-ssで動画の先頭時間の指定、2番目の-ssと1番目の-ssの差し引きが後ろをカットする時間になる
- -map 1:0 -map 0を使ってそれらを1入力扱いにして、そのトラックに中から -shortestで一番時間の短いところで出力時間が決まる
- なぜ-map 1:0を先にするかというと、この映像はカットするための時間を決める動画で最終出力には不要になりかつ、トラックを除外しやすい-map 0:0で標準入力するため
- -f nutはいろいろなコーデックを標準入出力できるので便利
- 標準入力で-map 0しているのは映像と音声、または字幕などのすべてのデータを元に-shortestで後ろをカットするから
- -map –0:0で不要なトラックを–で除外して出力している