Potong sebagian dari file video dari posisi awal ke posisi akhir dengan FFmpeg [duplikat]

144

Pertanyaan ini sudah ada jawabannya di sini:

Saya punya file video 30 menit, tetapi saya ingin mengekstrak video dari 00:09:23 hingga 00:25:33.

Saya dapat menentukan posisi awal dengan -ss, tetapi saya tidak dapat menemukan satu untuk posisi akhir. Tolong ada bantuan?

x74x61
sumber

Jawaban:

244

Instal ffmpeg

Pastikan Anda mengunduh versi terbaruffmpeg , dan jangan gunakan yang menyertai distribusi Anda (mis. Ubuntu). Versi paket dari berbagai distribusi sering kedaluwarsa dan tidak berlaku seperti yang diharapkan.

Atau kompilasi sendiri .

Cara memotong video, tanpa pengodean ulang

Gunakan ini untuk memotong video dari [start]untuk [duration]:

ffmpeg -ss [start] -i in.mp4 -t [duration] -c copy out.mp4

Di sini, opsi berarti yang berikut:

  • -ssmenentukan waktu mulai, misalnya 00:01:23.000atau 83(dalam detik)
  • -t menentukan durasi klip (format yang sama).
  • Baru-baru ini ffmpegjuga memiliki bendera untuk memasok waktu akhir -to.
  • -c copymenyalin video bitstream pertama, audio, dan subtitle dari input ke file output tanpa melakukan encoding ulang. Ini tidak akan merusak kualitas dan membuat perintah berjalan dalam hitungan detik.

Cara memotong video, dengan pengodean ulang

Jika Anda meninggalkan -c copyopsi, ffmpegakan secara otomatis menyandikan ulang video dan audio output sesuai dengan format yang Anda pilih. Untuk video dan audio berkualitas tinggi, baca Panduan Pengkodean x264 dan Panduan Pengkodean AAC .

Sebagai contoh:

ffmpeg -ss [start] -i in.mp4 -t [duration] -c:v libx264 -c:a aac -strict experimental -b:a 128k out.mp4
slhck
sumber
1
Di ubuntu 12:10, -c: v dan -c: a tidak berfungsi. Saya harus menggunakan "-acodec copy dan -vcodec copy" sebagai gantinya.
Samuel Lampa
1
@Samuel Kemudian Anda menggunakan versi yang sudah ketinggalan zaman, yang bahkan bukan FFmpeg asli, tetapi garpu Libav. Lihat: stackoverflow.com/a/9477756/1109017
slhck
Terima kasih untuk ini! jika Anda tidak menentukan durasi, apakah akan berakhir?
Jeff
@ Jeff Ya! (minimum karakter)
slhck
3
@Prateek Saat menyalin bitstream video (alih-alih menyandikan ulang), Anda hanya dapat memotong di keyframe . Jika ada keyframe pada detik 1, 2, dan 3, tetapi Anda ingin memotong pada 1,5 detik, maka ffmpeg akan menunggu hingga detik 2 sebelum mulai memotong. Itu membuatnya tidak akurat.
slhck
26

Saya pikir Anda dapat menggunakan perintah berikut sekarang.

ffmpeg -i inputFile -vcodec copy -acodec copy -ss 00:09:23 -to 00:25:33 outputFile

Lihat juga ffmpeg Doc , atau halaman wiki ini .

melarikan diri
sumber
6
ffmpeg -i inputFile -c copy -ss 00:09:23 -to 00:25:33 outputFileversi sederhana
nwgat
3
Saya harus menggunakan ffmpeg -ss 00:01:00 -i video.mp4 -to 00:02:00 -c copy -copyts cut.mp4versi (dengan -copyts), jika tidak salah potong (dengan layar hitam di awal). Terima kasih atas tautan kedua.
Necronomicron
Ini hebat, hal terakhir yang saya inginkan adalah menghitung durasi dari titik akhir.
Tomasz Gandor
Opsi -untuk menjawab pertanyaan yang sebenarnya ditanyakan. Sisa dari jawaban tidak sopan atau usang.
James Bowery
12

Ini aneh karena tidak ada yang menyarankan trim filter .

Jatuhkan semuanya kecuali menit kedua dari input:

ffmpeg -i INPUT -vf trim=60:120

Hanya simpan detik pertama:

ffmpeg -i INPUT -vf trim=duration=1

Lepaskan semuanya kecuali dari 13 ke 58:

ffmpeg -i INPUT -vf trim=13:58 OUTPUT
malat
sumber
8
Ya, bagus untuk disebutkan trimdan atrim. Saya biasanya menggunakan ini saat menyaring, tetapi pengguna harus mencatat bahwa penyaringan membutuhkan pengodean ulang .
Logan
Kamu adalah pahlawanku. Saya sangat membutuhkan filter yang melakukan ini.
fahadash
5

Anda dapat menggunakan dua metode ini yang berfungsi untuk Windows dan Linux.

Ada dua cara bagaimana membagi file video dengan ffmpeg. Yang pertama bagus dengan sendirinya, lebih dari itu - lebih cepat, tetapi kadang-kadang membuat file output dengan kelemahan tertentu. Jadi untuk kasus-kasus itu ada cara kedua pemisahan file video: itu jauh lebih lambat, file output lebih besar, tetapi tampaknya mereka selalu memiliki tingkat kualitas yang sama dengan file input yang digunakan.

Cara 1:

ffmpeg -ss <start> -i in1.avi -t <duration> -c copy out1.avi

Cara 2:

ffmpeg -ss <start> -i in1.avi -t <duration> out1.avi
  • <start>- bagian awal dari ffmpeg video adalah untuk memotong. Format:, 00:00:00.0000artinya jam: menit: detik: milidetik.

  • <duration>- durasi bagian dari ffmpeg video adalah untuk memotong. Format yang sama seperti di atas.

Contoh:

ffmpeg -ss 01:19:00 -i in1.avi -t 00:05:00 -c copy out1.avi
ffmpeg -ss 01:19:00 -i in1.avi -t 00:05:00 out1.avi

ffmpeg memotong sebagian file video mulai dari 1 jam 19 menit 0 detik. Durasi urutan video terputus adalah 5 menit 0 detik.

Christian Wörz
sumber
Oke, terima kasih. Akan memeriksa dokumen dan mencobanya besok.
juGGaKTidak
3
-sameqtidak berarti "kualitas yang sama" dan telah dihapus dari ffmpeg. Gunakan -codec copysebagai gantinya. Juga, jangan lupa tentang -toopsi ini.
Logan
Saya mengoreksi perintah dalam kutipan Anda, karena mereka sudah cukup usang. Tolong jangan salin-tempel informasi tanpa mengutipnya dengan benar.
slhck
-1

Anda bisa menggunakan ini

ffmpeg -sameq -ss clip_start -t duration  -i  original.ogg  clip.ogg

Di sini Anda harus memberikan durasi video. yaitu. 00: 25: 33-00: 09: 23

daya
sumber
1
Seperti yang saya sebutkan pada jawaban lain: Dengan perintah Anda, Anda menyandikan ulang file tersebut, yang sama sekali tidak perlu dan menghasilkan kualitas yang lebih rendah dan waktu pemrosesan yang meningkat.
slhck
-2

Saya menggunakan sintaks berikut untuk memotong video dengan ffmpef:

ffmpeg -sameq -ss [start_seconds] -t [duration_seconds] -i [input_file] [outputfile]

-t digunakan untuk mengatur durasi dalam detik - Anda tidak dapat menentukan waktu akhir tetapi ini harus bekerja untuk Anda

Michael Banzon
sumber
1
Mengapa Anda mengatur FFmpeg untuk menyandikan ulang file? Catatan itu -sameqtidak berarti "kualitas yang sama" sama sekali.
slhck