GNU/Linux >> Linux の 問題 >  >> Linux

ffmpeg を使用して開始時間と終了時間に基づいてビデオをカットする

これを使ってみてください。これは、私が理解している最速かつ最良の 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 で 上記のコマンドで、指定された時間に終了します。


Linux
  1. 最後にWindowsを使用したのはいつですか。

  2. ローリングリリースLinuxとは何ですか?それを使用することの本当の利点は何ですか

  3. Stdoutに出力し、同時にGrepをファイルに出力しますか?

  1. >、&>、>&、および 2&> を使用して出力をリダイレクトすることの違いは何ですか?

  2. Linux で C++ を使用してシステムの日付と時刻を設定する

  3. コピーと chmod/chown を同時に行う

  1. パフォーマンスと安定性のためのApache2Buddyスクリプトの使用

  2. ping と tcpdump を同時に行う

  3. awk を使用して、別の列の値に基づいて列の値を合計する