Sering ada kebutuhan di komunitas open source atau komunitas pengembang aktif untuk menerbitkan segmen video besar secara online. (Video pertemuan, perkemahan, pembicaraan teknologi ...) Karena saya adalah seorang pengembang dan bukan seorang videografer, saya tidak punya keinginan untuk membayar ekstra pada akun Vimeo premium. Bagaimana cara saya mengambil video pembicaraan teknologi MPEG 12,5 GB (1:20:00) dan mengirisnya menjadi segmen 00:10:00 agar mudah diunggah ke situs berbagi video?
ffmpeg
video-editing
Gabriel
sumber
sumber
Jawaban:
Membungkus ini menjadi sebuah skrip untuk melakukannya dalam satu lingkaran tidak akan sulit.
Berhati-hatilah bahwa jika Anda mencoba menghitung jumlah iterasi berdasarkan output durasi dari
ffprobe
panggilan yang diperkirakan dari bit rate rata-rata pada awal klip dan ukuran file klip kecuali Anda memberikan-count_frames
argumen, yang memperlambat operasinya secara signifikan. .Hal lain yang perlu diperhatikan adalah posisi
-ss
opsi pada baris perintah penting . Di mana saya memilikinya sekarang lambat tapi akurat. Versi pertama dari jawaban ini memberikan alternatif yang cepat tetapi tidak akurat . Artikel tertaut juga menjelaskan sebagian besar alternatif yang cepat-tapi-masih-akurat, yang Anda bayar dengan sedikit kerumitan.Selain itu, saya tidak berpikir Anda benar-benar ingin memotong tepat 10 menit untuk setiap klip. Itu akan memotong tepat di tengah kalimat, bahkan kata-kata. Saya pikir Anda harus menggunakan editor video atau pemutar untuk menemukan titik potong alami yang hanya berjarak 10 menit.
Dengan asumsi file Anda dalam format yang dapat diterima YouTube secara langsung, Anda tidak perlu memasukkan ulang kode untuk mendapatkan segmen. Lewati offset cut point natural
ffmpeg
, katakan untuk meneruskan A / V yang disandikan agar tidak tersentuh dengan menggunakan codec "copy":The
-c copy
Argumen mengatakan itu untuk menyalin semua aliran input (audio, video, dan berpotensi lainnya, seperti sub judul) menjadi output sebagai-adalah. Untuk program A / V sederhana, itu setara dengan bendera yang lebih verbose-c:v copy -c:a copy
atau bendera gaya lama-vcodec copy -acodec copy
. Anda akan menggunakan gaya yang lebih verbose ketika Anda ingin menyalin hanya satu aliran, tetapi menyandikan ulang yang lain. Misalnya, beberapa tahun yang lalu ada praktik umum dengan file QuickTime untuk mengompres video dengan video H.264 tetapi meninggalkan audio sebagai PCM yang tidak terkompresi ; jika Anda berlari melintasi file seperti itu hari ini, Anda dapat memodernkannya dengan-c:v copy -c:a aac
hanya memproses ulang streaming audio, membiarkan video tidak tersentuh.Titik awal untuk setiap perintah di atas setelah yang pertama adalah titik awal perintah sebelumnya ditambah durasi perintah sebelumnya.
sumber
ffmpeg
diperlukan untuk menjaga sinkronisasi antara stream audio dan video mungkin tidak ada dalam file sumber. Jika ini terjadi pada Anda, ada metode pemisahan yang lebih rumit yang menghindari masalah.Inilah solusi satu baris :
Harap dicatat bahwa ini tidak memberikan Anda pembagian yang akurat, tetapi harus sesuai dengan kebutuhan Anda. Sebagai gantinya akan dipotong pada frame pertama setelah waktu yang ditentukan setelah
segment_time
, dalam kode di atas akan setelah 20 menit.Jika ternyata hanya potongan pertama yang dapat dimainkan, coba tambahkan
-reset_timestamps 1
seperti yang disebutkan dalam komentar.sumber
-reset_timestamps 1
perbaikan masalah untuk sayaMenghadapi masalah yang sama sebelumnya dan mengumpulkan skrip Python sederhana untuk melakukan hal itu (menggunakan FFMpeg). Tersedia di sini: https://github.com/c0decracker/video-splitter , dan ditempel di bawah:
sumber
Jika Anda ingin membuat chunks yang benar-benar sama harus memaksa ffmpeg untuk membuat i-frame pada frame pertama setiap chunks sehingga Anda dapat menggunakan perintah ini untuk membuat chunk 0,5 detik.
sumber
Cara alternatif yang lebih mudah dibaca adalah
Inilah sumber dan daftar perintah FFmpeg yang umum digunakan.
sumber
Perhatikan tanda baca yang tepat dari format alternatif ini
-ss mm:ss.xxx
. Saya berjuang selama berjam-jam mencoba menggunakan intuitif-tetapi-salah tetapimm:ss:xx
tidak berhasil.Referensi di sini dan di sini .
sumber
sumber
Cukup gunakan apa yang dibangun ke ffmpeg untuk melakukan hal ini.
Ini akan membaginya menjadi chuck sekitar 2 detik, membaginya di keyframes yang relevan, dan akan menghasilkan file cam_out_h2640001.mp4, cam_out_h2640002.mp4, dll.
sumber