Saya ingin menggabungkan video dalam ukuran batch masing-masing dua puluh (20). Saya menjalankan mesin Linux. Video dalam format mp4 dan kualitas sedang. Beberapa bahkan memiliki aliran audio yang hilang. Sejauh ini saya sudah mencobaffmpeg
, mencoder
, cvlc/vlc
dan MP4Box
. Saya ingin menulis skrip baris perintah untuk mencapai ini, karena saya sedang melakukan pemrosesan batch.
Masalah utama adalah bahwa beberapa solusi yang saya coba berfungsi dengan baik untuk dua video, beberapa bekerja dengan baik untuk video dengan aliran audio dan yang lain bekerja dengan baik untuk beberapa bagian lain dari set video saya. Namun, saya belum dapat menemukan solusi komprehensif untuk tugas ini.
ffmpeg
, termasuk filter dan protokol file. Saya juga mencoba menggunakanconcat
fiturcvlc/vlc
. Saya juga mencobaconcat
fiturmencoder
. Semua ini bekerja sebagian. Ini akhirnya membantu saya menyelesaikan masalah ini.melt {input-sequence} -consumer avformat:{output-name} acodec=libmp3lame vcodec=libx264
Jawaban:
Saya menggunakan
mkvmerge
untuk menggabungkan beberapa file MP4 menjadi satu:sumber
.mkv
untuk file output, karena merupakan wadah Matroska terlepas dari ekstensi apa yang Anda berikan.mkvmerge
: tipsonubuntu.comAnda dapat melakukannya menggunakan
ffmpeg
:referensi dan info lebih lanjut
sumber
Ini menyelesaikan masalah: https://stackoverflow.com/a/22324018/5014767
melt
adalah utilitas perintah baris yang bagus untuk ini. Sini halamannyaEdit dari komentar: Perintah yang memecahkan masalah saya adalah ini
melt {input-sequence} -consumer avformat:{output-name} acodec=libmp3lame vcodec=libx264
sumber
Saya menulis skrip shell kecil untuk menyelesaikan MP4 tanpa transcoding menggunakan ffmpeg.
Ini membuat file antara dalam wadah MPEG dan kemudian menggabungkannya menjadi MP4.
sumber
for f in *.MP4
tanpa menggunakanls
. (Anda harus selalu menghindari penggunaanls
dalam skrip karena beberapa alasan penting; ada opsi yang lebih baik.) Juga, gunakan tanda kutip untuk variabel kecuali Anda yakin bahwa tidak ada spasi atau karakter khusus lainnya, jadi"${f}"
(atau hanya"$f"
) bukannya tanda kutip$f
.CONCAT=$(echo $(ls *.ts) | sed -e "s/ /|/g")
tidak bekerja dengan baik dengan nama file yang 1, 2, 3 ... 10 ... 20. Akhirnya parsing mereka sebagai 1, 10 ... 2, 20 ... dll. Saya sarankanCONCAT=$(echo $(ls -v *.ts) | sed -e "s/ /|/g")
ini akan memastikan pesanan .Buat file files.txt dengan semua file yang Anda ingin gabungkan dalam bentuk berikut (baris yang dimulai dengan # diabaikan):
Perhatikan bahwa ini bisa berupa jalur relatif atau absolut. Kemudian Anda dapat melakukan streaming menyalin atau menyandikan ulang file Anda:
sumber
Script saya, murni dalam
bash
danffmpeg
. Mengkode ulang file yang diberikan pada baris perintah menjadi satu.Membutuhkan file dengan resolusi yang sama. Menerima rotasi metadata berbeda, yang
ffmpeg concat:
tidak.sumber
Saya membuat skrip Python yang, menggunakan moviepy , dapat menggabungkan juga subsegmen (berguna jika Anda ingin misalnya menghapus beberapa bagian dari video).
Gunakan dengan:
sumber
Selain jawaban Maythux, dari :
Yaitu video yang akan digabungkan menggunakan salah satu wadah video yang disebutkan di atas (yang saya akan menambahkan MPEG-4 Bagian 14 untuk pengalaman pribadi), Anda dapat:
sumber