Saya mencoba menggunakan FFmpeg untuk membagi video berdasarkan beberapa start_time
dan end_time
input, dan menggantinya dengan file video lainnya. Misalnya, untuk input 10 15
saya perlu mengganti EXACT detik 10 to 15
dengan video lain.
BAIK. Apa yang terlintas dalam pikiran saya adalah ini:
- Pisahkan dulu video (dalam hal ini, 0-10, 10-15, dan 15-end)
- Ganti 10-15 dengan video lainnya
- Gabungkan semua sub-video kembali
Pertanyaan pertama: Apakah ini solusi terbaik dan tercepat? Apakah kita memiliki perintah yang lebih mudah atau alat lain untuk mengganti periode waktu tertentu dalam video dengan video lain?
Pertanyaan kedua: Dengan asumsi FFmpeg adalah solusi yang layak, ketika saya cukup menggunakan perintah ffmpeg -I input.video -ss 10 -t 5 -c copy output.mp4
, kode pemrosesan video saya tidak dapat membaca dan memproses file. Saya menggunakan mediainfo
alat untuk membandingkan dua file dan melihat perbedaan dalam ukuran header sementara semua hal terkait video codec adalah sama. Saya perhatikan UKURAN HEADER berbeda yang tampaknya menyebabkan masalah. Apakah ada cara untuk memaksa ukuran header juga (selain dari codec) sama?
UPDATE: Ini adalah .mp4
file asli yang berfungsi dengan baik di emulator.
.mp4
file asli jika diperlukan.Jawaban:
Menggunakan
trim
danconcat
- sumber file dengan codec yang berbedaUntuk ini, pastikan bahwa masing-masing file Anda memiliki resolusi yang sama, dan idealnya framerate yang sama dan subsampel kroma dll. Ini akan mencegah kesalahan atau gangguan selama penggabungan.
Anda dapat melakukan semuanya sekaligus tanpa memisahkan file, menggunakan
trim
danconcat
filter:Di sini,
trim
digunakan untuk menentukan bagian individual dari stream video input (0:v
,1:v
) yang nantinya Anda ingin gabungkan. Bagian-bagian ini dinamaiv0
melaluiv2
. (setpts
Filter akan menyetel ulang stempel waktu masing-masing komponen menjadi 0, yang diperlukan untuk penyatuan). Kemudian, kami menggabungkan tiga bagian.Jika Anda ingin memotong dari cap waktu tertentu hingga akhir, gunakan
trim=start=15
alih-alih menentukan rentang.Jika file Anda memiliki audio, Anda harus memotong aliran itu secara terpisah:
Perhatikan bahwa video dan audio akan disandikan ulang dalam kasus ini - pastikan untuk menentukan target kualitas keluaran yang sesuai (misalnya
-crf
untuk x264, x265 atau libvpx-vp9). Anda dapat membaca lebih lanjut tentang ini di FFmpeg Wiki, misalnya untuk VP9 atau H.264 .Menggunakan segmen individual
Jika Anda ingin membagi klip dan kemudian merakitnya:
Jika file memiliki audio, gunakan pendekatan yang sama seperti di atas:
Ini lagi akan menyandikan ulang aliran video. Ini sedikit lebih mudah tetapi sebaliknya harus setara dengan metode di atas.
Menggunakan
concat
demuxerPada prinsipnya Anda juga dapat mencoba menyatukan bitstream tanpa meng-encode ulang, menggunakan demuxer concat. Buat file yang dipanggil
concat.txt
dan tambahkan entri berikut (sesuai dengan klip video yang dibuat di atas):Kemudian gabungkan file-file individual ini:
Namun ini membutuhkan klip Anda untuk memiliki codec, resolusi, framerate dll yang sama - sehingga tidak bekerja dengan semua jenis sumber heterogen.
Menggunakan
concat
protokolJenis penggabungan tingkat file di atas dapat dicapai dengan menggunakan
concat
protokol juga, dengan jenis kendala yang sama seperti di atas (codec, resolusi, dll yang sama):Untuk info lebih lanjut tentang penggabungan, baca halaman Wiki FFmpeg masing - masing .
sumber
concat
metode melempar kesalahan:[concat @ 00000000025c2560] Line 1: unknown keyword 'part1.mp4 \\ text.txt: Invalid data found when processing input
concat
demuxer, sintaksnya berbeda. Diperbaiki sekarang Untuk mencapai akhir, gunakantrim=start=15
, lihat dokumentasi trim filter: ffmpeg.org/ffmpeg-filters.html#trim - seperti untuk masalah waktu, ini sangat tergantung pada bahan sumber Anda. Belum ada masalah penggabungan dengan klip yang Anda unggah.