Saya mengalami kesulitan menemukan aplikasi cli yang dapat mengambil file video (avi, mkv, dan mp4 lebih disukai) dan memotong klip yang sangat pendek (2-6 detik) dengan ketepatan waktu yang presisi. Saya sudah mencoba ffmpeg , mencoder , avidemux , dan mp4box tetapi mereka semua memotong keyframe yang membuat klip 6+ detik. Apakah ada alat yang akan menyandikan ulang file input dan memotong waktu yang akurat atau memotong secara tidak akurat, menyandi ulang, dan kemudian memotong secara akurat?
command-line
video
video-editing
mp4
curmil
sumber
sumber
-ss
parameter setelah-i
), itu harus lebih akurat.Jawaban:
Memotong video dengan
ffmpeg
Anda dapat memotong video secara akurat dengan FFmpeg. Sejak versi 2.5 sangat mudah. Misalnya akan memotong 10 detik, mulai dari 0 menit, 3 detik dan 123 milidetik.
Posisi dan waktu dapat dalam detik atau dalam
hh:mm:ss[.xxx]
bentuk.Perhatikan bahwa dalam contoh ini, video akan disandikan ulang menggunakan enkoder x264 ; audio disalin.
Anda juga bisa menggunakan
-to
alih-alih-t
menentukan titik akhir alih-alih durasinya. Dalam hal ini, bagaimanapun,-to
adalah setara dengan-t
, karena dengan meletakkan-ss
di depan-i
, ffmpeg pertama-tama akan mencari ke titik itu dan kemudian mulai menghasilkan.Lihat juga entri Mencari wiki.
Pemotongan yang akurat untuk
ffmpeg
versi yang lebih lamaJika Anda memiliki versi ffmpeg yang lebih lama, maka untuk pencarian yang akurat, Anda perlu menempatkan
-ss
setelahnya-i
, yang membuat proses pengkodean sedikit lebih lambat, karena seluruh video harus diterjemahkan terlebih dahulu:Di sini,
-to
dan-t
berperilaku berbeda.-t 10
akan membuat klip berdurasi sepuluh detik, sedangkan-to 10
akan membuat klip yang berdurasi tujuh detik.sumber
-c:v libx264 -c:a libfaac
saya pikir kita bisa menggunakan-acodec copy -vcodec copy
yang memberitahu ffmpeg hanya untuk mendeteksi dan menggunakan codec yang sama dengan file aslinya. Adakah yang bisa mengkonfirmasi?-c:a aac -strict experimental
. Itu solusi paling sederhana.Satu-satunya alat baris perintah Linux yang saya temukan sejauh ini, yang dapat memotong pada frame yang tepat (atau, dengan akurasi frame), adalah
melt
(sudo apt-get install melt
).Katakanlah Anda memiliki
inputvid.mp4
- periksa pengaturan penyandiannya dulu dengan mengatakanffmpeg
(di sini, saya hanya mengatakan saya ingin menyandikannya lagi-f mp4
, tetapi sebagai file/dev/null
sehingga keluarannya dibuang; saya mengarahkan stderr agar saya dapat menerimanya - catatan di tengah , perintahnya meminta, dan Anda harus menjawaby
dengan ENTER, sehingga proses melanjutkan dan membuang info yang berguna; ini dengan ffmpeg 3.3.3 di Ubuntu 14):Ok, jadi kita bisa melihat
ffmpeg
lagi memilihlibx264
danaac
encoders untuk video ini; maka kita dapat memasukkan ini untukmelt
:.... dan
melt
akan memotong dengan bagian di antara frame 7235 dan 7349 menjadi file barucut.mp4
,. Kemudian untuk memeriksa apakahcut.mp4
loop benar, gunakanmelt
lagi untuk memutarnya dua kali - dan putar ke jendela SDL:... dan inilah yang
ffmpeg
dilihat untuk file ini:Pengaturan pengkodean video untuk
cut.mp4
tampaknya identik denganinputvid.mp4
kecuali bitrate video berubah dari 389 kb / s menjadi 526 kb / s, dan juga pengaturan pengodean audio hampir sama, kecuali laju pengambilan sampel berubah dari 44100 ke 48000 Hz; meskipun itu bisa diatur dengan:... Namun, bahkan dengan ini, bitrate video akhir untuk saya berakhir 337 kb / s. Namun, pemotongan lingkaran baik-baik saja (dan itu termasuk audio) ketika diputar dalam satu lingkaran, jadi saya kira ini memang bingkai-akurat ...
sumber
melt
meng-encode ulang video, dan menggunakan pustaka FFmpeg di bawahnya. Jika Anda mengizinkan pengodean ulang, ffmpeg dapat menghasilkan output yang sama.melt
menggunakan perpustakaan FFmpeg), senang tahu!Seperti kata Baodad dalam komentar (saya memposting karena tidak mudah untuk menemukan jika Anda membaca dengan cepat), pendekatan yang lebih baik adalah mendeteksi encoders audio / video secara otomatis oleh ffmpeg, jadi:
sumber