Gabungkan segmen dari berbagai video ffmpeg

2

Bisakah saya menggunakan ffmpeg untuk membuat satu video yang mengambil segmen berbeda dari video yang berbeda?

1.webm, 2.webm, 3.webm, 4.webm 

Itu adalah 4 file video saya. Saya ingin 10 detik dari setiap video. Segmen ditentukan oleh saya.

ffmpeg -i 1.webm -1 2.webm -i 3.webm -i 4.webm -ss 00:00:00 -t 10 -ss 00:00:10  \
-t 10 -ss 00:00:20 -t 10 -ss 00:00:30 -t 10;

Di atas bukan perintah nyata yang bekerja. Bisakah saya mendapatkan sesuatu seperti ini secara terprogram?

Pavan K
sumber
mungkin terlambat ke pesta tetapi versi terbaru dari ffmpeg memiliki filter canggih yang disebut concatdec_selectdapat melakukan semua kebutuhan Anda dalam satu langkah superuser.com/a/1020455/15252
est

Jawaban:

2

Anda tidak dapat melakukan ini dalam satu perintah. Namun, dengan asumsi Anda menjalankan di Linux dan memiliki Bash (atau yang serupa) sebagai shell Anda, yang diperlukan hanyalah dua perintah. Harap dicatat bahwa ini hanya berfungsi jika semua video memiliki codec video dan audio dan basis waktu yang sama persis (fps, dll.).

1. Buat daftar video dan mulailah waktu

Anda pertama-tama harus membuat daftar edit yang berisi yang berikut ini. Sebut saja videos:

1.webm 00:00:00
2.webm 00:00:10
3.webm 00:00:20

Perhatikan bahwa ini tidak mendukung nama video dengan spasi.

2. Membagi video

Sekarang kita akan membuat folder sementara untuk menampung video kecil kita. Sebut saja tmp. Kemudian Anda dapat membagi file Anda seperti ini:

while read video time; do ffmpeg -i $video -ss $time -t 10 -c copy tmp/$video; done < videos

Di sini, -t 10berarti kami akan memotong 10 detik dari video, mulai dari stempel waktu yang ditentukan oleh -ss. Anda juga dapat menggunakannya -todaripada -tmemotongnya sampai titik tertentu.

Jika semua video input Anda memiliki codec video dan audio yang berbeda, Anda harus menyandikan ulang video pada saat ini. Untuk ini, Anda harus mengganti -c copybagian dengan pengaturan codec video dan audio tertentu, misalnya -c:v libx264 -c:a libfaacuntuk video dan audio H.264 / AAC.

3. Menggabungkan video

Sekarang, menggunakan concatprotokol kita dapat menggabungkan file kembali bersama-sama:

ffmpeg -f concat -i <(for f in tmp/*.webm; do echo "file '$f'"; done) -c copy output.webm

Ini yang kamu butuhkan. Ia bekerja dengan secara dinamis membuat file penggabungan dengan cepat. Jika tidak, Anda harus membuat secara manual sesuai dengan concatdokumentasi .

Akhirnya Anda bisa membersihkan tmpfolder Anda .

slhck
sumber
Saya hanya memperhatikan bahwa video konser tidak diputar. Mereka bermain di media player di ubuntu tetapi gagal bermain di vlc di mesin yang sama. Apa alasan Anda bisa memikirkan mengapa ini terjadi?
Pavan K
Itu bisa terjadi. Jika video asli memiliki parameter penyandian yang sedikit berbeda, rangkaian dapat menghasilkan file yang tidak dapat diputar. Bisakah Anda mencoba menukar -c copyperintah terakhir dengan -c:v libvpx -b:v 1M -c:a libvorbisdan melihat apakah itu menghasilkan file yang dapat diputar?
slhck
Tetapi dengan menentukan -b: v itu akan mengubah bitrate yang saya ingin tidak menyentuh. izinkan saya mencoba dengan opsi lain
Pavan K
Nah, dengan perintah itu Anda akan menyandikan ulang semuanya alih-alih menyalin aliran, sehingga bitrate 1MBit / s hanyalah contoh untuk tujuan debugging.
slhck
Oh Jika saya hanya ingin membuang stream tanpa memodifikasi params, dapatkah ini dilakukan?
Pavan K