これを使ってみてください。これは、私が理解している最速かつ最良の ffmpeg の方法です:
ffmpeg -ss 00:01:00 -to 00:02:00 -i input.mp4 -c copy output.mp4
このコマンドは数秒で動画をトリミングします!
コマンドの説明:
<ブロック引用>
-i: 入力ファイルを指定します。その場合は(input.mp4)です。
-ss: -i と一緒に使用すると、入力ファイル (input.mp4) 内で位置をシークします。
00:01:00: これは、トリミングされたビデオが開始される時間です。
-to: これは、開始 (00:01:40) から終了 (00:02:12) までの期間を指定します。
00:02:00: これは、トリミングされたビデオが終了する時間です。
-c コピー: これは、ストリーム コピーを介してトリミングするオプションです。 (注:非常に高速)
タイミングの形式は次のとおりです:hh:mm:ss
現在非常に支持されている回答は時代遅れであり、トリムが非常に遅くなることに注意してください。詳細については、この公式の ffmpeg 記事を参照してください。
これが私が使用するもので、数秒しかかかりません 実行する:
ffmpeg -i input.mp4 -ss 01:19:27 -to 02:18:51 -c:v copy -c:a copy output.mp4
リファレンス:Alexander Refsum Jensenius による FFmpeg を使用したビデオ ファイルのトリミング .
生成された mp4
ファイルは iMovie
でも使用できます . get_duration(input_video) モデルを使用して全期間を取得するための詳細情報。
複数のカット シーンを連結する場合は、次の Python スクリプトを使用できます:
#!/usr/bin/env python3
import subprocess
def get_duration(input_video):
cmd = ["ffprobe", "-i", input_video, "-show_entries", "format=duration",
"-v", "quiet", "-sexagesimal", "-of", "csv=p=0"]
return subprocess.check_output(cmd).decode("utf-8").strip()
def main():
name = "input.mkv"
times = []
times.append(["00:00:00", "00:00:10"])
times.append(["00:06:00", "00:07:00"])
# times = [["00:00:00", get_duration(name)]]
if len(times) == 1:
time = times[0]
cmd = ["ffmpeg", "-i", name, "-ss", time[0], "-to", time[1], "-c:v", "copy", "-c:a", "copy", "output.mp4"]
subprocess.check_output(cmd)
else:
open('concatenate.txt', 'w').close()
for idx, time in enumerate(times):
output_filename = f"output{idx}.mp4"
cmd = ["ffmpeg", "-i", name, "-ss", time[0], "-to", time[1], "-c:v", "copy", "-c:a", "copy", output_filename]
subprocess.check_output(cmd)
with open("concatenate.txt", "a") as myfile:
myfile.write(f"file {output_filename}\n")
cmd = ["ffmpeg", "-f", "concat", "-i", "concatenate.txt", "-c", "copy", "output.mp4"]
output = subprocess.check_output(cmd).decode("utf-8").strip()
print(output)
if __name__ == "__main__":
main()
サンプル スクリプトは 00:00:00 - 00:00:10
の間でシーンをカットしてマージします と 00:06:00 - 00:07:00
.
動画全体をカットしたい場合(mkv
を変換したい場合) mp4
にフォーマット ) 次の行のコメントを外してください:
# times = [["00:00:00", get_duration(name)]]
ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 -c copy cut.mp4
-c コピー を使用 すぐにメイクできます。その場合、ffmpeg はビデオを再エンコードせず、適切なサイズにカットします。
おそらく、3 秒のマークにキーフレームがありません。非キーフレームは他のフレームとの違いをエンコードするため、前のキーフレームから始まるすべてのデータが必要です。
mp4 コンテナを使用すると、編集リストを使用して再エンコードせずに非キーフレームでカットできます。つまり、3 秒前の最も近いキーフレームが 0 秒の場合、0 秒から始まるビデオをコピーし、編集リストを使用して 3 秒後に再生を開始するようプレーヤーに指示します。
git master の最新の ffmpeg を使用している場合は、指定したコマンドを使用して呼び出されたときに、編集リストを使用してこれを行います。これが機能しない場合は、古いバージョンの ffmpeg を使用しているか、プレーヤーが編集リストをサポートしていない可能性があります。一部のプレーヤーは編集リストを無視し、常にファイル内のすべてのメディアを最初から最後まで再生します。
非キーフレームから正確にカットし、編集リストをサポートしていないプレーヤーで目的のポイントから再生したい場合、またはカット部分が実際には出力ファイルに含まれていないことを確認したい場合 (たとえば、機密情報が含まれている場合)、希望する開始時間に正確にキーフレームが存在するように再エンコードすることで、これを行うことができます。 copy
を指定しない場合、再エンコードがデフォルトです .例:
ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 cut.mp4
再エンコードするときは、品質関連のオプションや特定の AAC エンコーダーを追加することもできます。詳細については、ビデオについては ffmpeg の x264 エンコーディング ガイド、オーディオについては AAC エンコーディング ガイドを参照してください。
また、-t
オプションは、終了時間ではなく期間を指定します。上記のコマンドは、3 秒から始まる 8 秒のビデオをエンコードします。 3 秒で開始して 8 秒で終了するには、-t 5
を使用します . ffmpeg の現在のバージョンを使用している場合は、 -t
を置き換えることもできます -to
で 上記のコマンドで、指定された時間に終了します。