GNU/Linux >> Belajar Linux >  >> Linux

Memotong video berdasarkan waktu mulai dan berakhir menggunakan ffmpeg

Coba gunakan ini. Ini adalah cara ffmpeg tercepat dan terbaik yang pernah saya temukan:

 ffmpeg -ss 00:01:00 -to 00:02:00  -i input.mp4 -c copy output.mp4

Perintah ini memotong video Anda dalam hitungan detik!

Penjelasan perintahnya:

-i: Ini menentukan file input. Dalam hal ini adalah (input.mp4).
-ss: Digunakan dengan -i, ini mencari di file input (input.mp4) ke posisi.
00:01:00: Inilah saatnya video yang dipangkas akan dimulai.
-ke: Ini menentukan durasi dari awal (00:01:40) hingga akhir (00:02:12).
00:02:00: Ini adalah saat video Anda yang dipangkas akan berakhir.
-c salin: Ini adalah opsi untuk memangkas melalui salinan aliran. (NB:Sangat cepat)

Format waktunya adalah:hh:mm:ss

Harap perhatikan bahwa jawaban yang sangat disukai saat ini sudah usang dan trim akan sangat lambat. Untuk informasi selengkapnya, lihat artikel resmi ffmpeg ini.


Inilah yang saya gunakan dan hanya membutuhkan waktu beberapa detik untuk menjalankan:

ffmpeg -i input.mp4 -ss 01:19:27 -to 02:18:51 -c:v copy -c:a copy output.mp4

Referensi:Potong file video menggunakan FFmpeg oleh Alexander Refsum Jensenius .

mp4 dihasilkan file juga dapat digunakan di iMovie . Info selengkapnya terkait mendapatkan durasi penuh menggunakan model get_duration(input_video).

Jika Anda ingin menggabungkan beberapa adegan potongan, Anda dapat menggunakan skrip Python berikut:

#!/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()

Contoh skrip akan memotong dan menggabungkan adegan di antara 00:00:00 - 00:00:10 dan 00:06:00 - 00:07:00 .

Jika Anda ingin memotong video lengkap (jika Anda ingin mengonversi mkv format menjadi mp4 ) cukup batalkan komentar pada baris berikut:

# 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 

Gunakan -c copy untuk make in secara instan. Dalam hal ini ffmpeg tidak akan menyandikan ulang video, hanya akan dipotong sesuai ukuran.


Anda mungkin tidak memiliki keyframe pada tanda 3 detik. Karena non-keyframe menyandikan perbedaan dari frame lain, mereka membutuhkan semua data yang dimulai dengan keyframe sebelumnya.

Dengan wadah mp4 dimungkinkan untuk memotong non-keyframe tanpa pengkodean ulang menggunakan daftar edit. Dengan kata lain, jika bingkai utama terdekat sebelum 3 detik adalah 0 detik, video akan disalin mulai dari 0 detik dan menggunakan daftar edit untuk memberi tahu pemain agar mulai memutar dalam 3 detik.

Jika Anda menggunakan ffmpeg terbaru dari git master, ini akan dilakukan menggunakan daftar edit saat dipanggil menggunakan perintah yang Anda berikan. Jika ini tidak berhasil untuk Anda, Anda mungkin menggunakan versi ffmpeg yang lebih lama, atau pemutar Anda tidak mendukung daftar edit. Beberapa pemain akan mengabaikan daftar edit dan selalu memutar semua media dalam file dari awal hingga akhir.

Jika Anda ingin memotong dengan tepat mulai dari non-keyframe dan ingin memutar mulai dari titik yang diinginkan pada pemutar yang tidak mendukung daftar edit, atau ingin memastikan bahwa bagian yang dipotong tidak benar-benar ada di file keluaran (misalnya jika mengandung informasi rahasia), maka Anda dapat melakukannya dengan melakukan re-encoding sehingga akan ada keyframe tepat pada waktu start yang diinginkan. Pengkodean ulang adalah default jika Anda tidak menentukan copy . Misalnya:

ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 cut.mp4

Saat menyandikan ulang, Anda mungkin juga ingin menyertakan opsi terkait kualitas tambahan atau pembuat enkode AAC tertentu. Untuk mengetahui detailnya, lihat Panduan Enkode x264 ffmpeg untuk video dan Panduan Enkode AAC untuk audio.

Juga, -t opsi menentukan durasi, bukan waktu akhir. Perintah di atas akan menyandikan 8 detik video mulai dari 3 detik. Untuk memulai pada 3 detik dan berakhir pada 8 detik, gunakan -t 5 . Jika Anda menggunakan versi ffmpeg saat ini, Anda juga dapat mengganti -t dengan -to dalam perintah di atas untuk mengakhiri pada waktu yang ditentukan.


Linux
  1. Output Ke Stdout Dan Pada Saat Yang Sama Grep Ke File?

  2. Apa perbedaan antara menggunakan `sh` dan `source`?

  3. Tetapkan tanggal dan waktu Sistem menggunakan C++ di Linux

  1. Apa itu Rolling Release Linux dan Apa Manfaat Nyata Menggunakannya

  2. Ping dan tcpdump secara bersamaan

  3. Menggunakan awk untuk menjumlahkan nilai kolom, berdasarkan nilai kolom lain

  1. Cara Memutar Video Menggunakan FFMpeg Dari Commandline

  2. Atur tanggal, waktu, dan zona waktu di server Linux

  3. Menggunakan skrip Apache2Buddy untuk kinerja dan stabilitas