Saya ingin membagi video avi besar menjadi dua video kecil berturut-turut. Saya menggunakan ffmpeg.
Salah satu caranya adalah dengan menjalankan ffmpeg dua kali:
ffmpeg -i input.avi -vcodec copy -acodec copy -ss 00:00:00 -t 00:30:00 output1.avi
ffmpeg -i input.avi -vcodec copy -acodec copy -ss 00:30:00 -t 00:30:00 output2.avi
Tetapi menurut halaman manual ffmpeg, saya dapat membuat lebih dari satu file ouput dari satu file input hanya dengan menggunakan satu baris:
ffmpeg -i input.avi -vcodec copy -acodec copy -ss 00:00:00 -t 00:30:00 output1.avi \
-vcodec copy -acodec copy -ss 00:30:00 -t 00:30:00 output2.avi
Pertanyaan saya adalah, apakah pendekatan selanjutnya menghemat waktu komputasi dan memori?
htop
), dan memberi tahu kami apa jawabannya?-ss
opsi input pada pembagian kedua mungkin tidak akurat, jadi Anda mungkin tidak mendapatkan pemisahan yang bersih. IMO contoh OP lebih tepat.Jawaban:
Wiki ffmpeg menautkan kembali ke halaman ini mengacu pada "Bagaimana membagi video secara efisien". Saya tidak yakin halaman ini menjawab pertanyaan itu, jadi saya melakukan seperti yang disarankan @AlcubierreDrive…
Output mana ...
Saya menguji file SD & HD, setelah beberapa kali berjalan & sedikit matematika.
File SD = 1,35GB aliran transportasi DVB
file HD = 3,14GB aliran transportasi DVB
Kesimpulan
Perintah tunggal lebih baik jika Anda menangani HD, ini setuju dengan komentar manual tentang penggunaan -ss setelah file input untuk melakukan 'pencarian lambat'. File SD memiliki perbedaan yang dapat diabaikan.
Versi dua perintah harus lebih cepat dengan menambahkan -ss sebelum file input untuk 'pencarian cepat' diikuti dengan pencarian lambat yang lebih akurat.
sumber
-q:v 0
.Berikut adalah skrip yang berguna, ini membantu Anda memisahkan secara otomatis: Skrip untuk membagi video menggunakan ffmpeg
sumber
Dalam pengalaman saya, jangan gunakan ffmpeg untuk memisahkan / bergabung. MP4Box, lebih cepat dan ringan dari ffmpeg. Silakan mencobanya. Misalnya jika Anda ingin membagi file MP4 1400mb menjadi dua bagian menjadi 700mb Anda dapat menggunakan cmdl berikut:
MP4Box -splits 716800 input.mp4
misalnya untuk menggabungkan dua file Anda dapat menggunakan:Atau jika Anda perlu membagi waktu, gunakan
-splitx StartTime:EndTime
:MP4Box -add input.mp4 -splitx 0:15 -new split.mp4
sumber
EndTime
daripada-t
.http://ffmpeg.org/trac/ffmpeg/wiki/Seeking%20with%20FFmpeg mungkin juga berguna bagi Anda. Juga ffmpeg memiliki muxer segmen yang mungkin berfungsi.
Pokoknya tebakan saya adalah menggabungkan mereka menjadi satu perintah akan menghemat waktu.
sumber
Tidak ada perbedaan besar antara kedua contoh yang Anda berikan. Contoh pertama memotong video secara berurutan, dalam 2 langkah, sedangkan contoh kedua melakukannya secara bersamaan (menggunakan utas). Tidak ada percepatan tertentu yang akan terlihat. Anda dapat membaca lebih lanjut tentang membuat beberapa output dengan FFmpeg
Lebih jauh lagi, yang dapat Anda gunakan (dalam FFmpeg baru-baru ini) adalah muxer pemisah aliran yang dapat:
sumber
Berikut adalah file bat Windows sederhana untuk membagi file yang masuk menjadi 50 bagian. Setiap bagian berdurasi 1 menit. Maaf untuk skrip bodoh seperti itu. Saya berharap lebih baik memiliki skrip windows yang bodoh daripada tidak memilikinya sama sekali. Mungkin itu membantu seseorang. (Berdasarkan "bat file for loop" dari situs ini.)
sumber
ffmpeg
perintah berurutan ) yang ditulis ulang sebagai loop. Ini tidak menjawab pertanyaan apakah pendekatan itu atau satu perintah akan "menghemat waktu komputasi dan memori".Tidak melakukan pengujian, tetapi ini terlihat menjanjikan:
Pemisah aliran dasar
Ini jelas membagi AVI menjadi beberapa segmen dengan ukuran yang sama, yang menyiratkan bahwa potongan ini tidak kehilangan kualitas atau meningkatkan memori atau harus dihitung ulang.
Ia juga menggunakan salinan codec - apakah itu berarti ia dapat menangani aliran yang sangat besar? Karena ini masalah saya, saya ingin memecah avi saya sehingga saya bisa menggunakan filter untuk menghilangkan distorsinya. Tapi keseluruhan avi berjalan berjam-jam.
sumber
Berikut adalah cara sempurna untuk membagi video. Saya telah melakukannya sebelumnya, dan itu bekerja dengan baik untuk saya.
ffmpeg -i C:\xampp\htdocs\videoCutting\movie.mp4 -ss 00:00:00 -t 00:00:05 -async 1 C:\xampp\htdocs\videoCutting\SampleVideoNew.mp4
(Untuk cmd).shell_exec('ffmpeg -i C:\xampp\htdocs\videoCutting\movie.mp4 -ss 00:00:00 -t 00:00:05 -async 1 C:\xampp\htdocs\videoCutting\SampleVideoNew.mp4')
(untuk php).Silakan ikuti ini dan saya yakin ini akan bekerja dengan sempurna.
sumber
-i
diikuti oleh-ss
dan-t
. Pertanyaannya adalah tentang cara mengekstrak beberapa segmen secara efisien dari file input yang sama, sedangkan Anda hanya mengekstrak satu segmen. Saya tidak melihat bagaimana ini menjawab pertanyaan itu.salah satu cara sederhana adalah dengan menggunakan opsi trim dengan api berbasis url publitio .
setelah Anda mengupload video, cukup setel offset awal dan offset akhir di url (so_2, eo_2) seperti ini:
ini akan membuat video baru secara instan mulai dari detik ke-2 dan berdurasi 2 detik. Anda dapat membagi video dengan cara ini sesuka Anda.
sumber
ffmpeg
. Kecuali jika Anda memiliki koneksi internet yang sangat, sangat cepat, saya pikir harus mengunggah seluruh video ke layanan cloud dan kemudian mengunduh hasilnya akan meningkatkan waktu pemrosesan secara signifikan. Meski begitu, ini masih belum menjawab pertanyaan denganffmpeg
pendekatan mana yang lebih efisien.