Saya ingin menggabungkan dua file mp4 untuk membuat satu. Aliran video dikodekan dalam h264 dan audio dalam aac. Saya tidak dapat menyandikan ulang video ke format lain karena alasan komputasi. Juga, saya tidak dapat menggunakan program GUI, semua pemrosesan harus dilakukan dengan utilitas baris perintah Linux. FFmpeg tidak dapat melakukan ini untuk file mpeg4 jadi saya menggunakan MP4Box:
MP4Box -add video1.mp4 -cat video2.mp4 newvideo.mp4
Sayangnya audio menjadi kacau. Saya pikir masalahnya adalah audio di aac jadi saya menyalinnya di mp3 dan menggunakan lagi MP4Box. Dalam hal ini audio baik-baik saja untuk bagian pertama newvideo.mp4
(sesuai dengan video1.mp4
) tetapi kemudian tidak ada audio dan saya tidak dapat menavigasi dalam video juga.
Pikiran saya berikutnya adalah bahwa stream audio dan video memiliki beberapa perbedaan kecil yang harus saya perbaiki. Jadi untuk setiap input video saya memisahkan stream video dan audio dan kemudian bergabung dengan mereka dengan opsi -shortest di FFmpeg.
Jadi untuk video pertama saya berlari:
avconv -y -i video1.mp4 -c copy -map 0:0 videostream1.mp4
avconv -y -i video1.mp4 -c copy -map 0:1 audiostream1.m4a
avconv -y -i videostream1.mp4 -i audiostream1.m4a -c copy -shortest video1_aligned.mp4
Begitu pula untuk video kedua dan kemudian menggunakan MP4Box seperti sebelumnya. Sayangnya ini juga tidak berhasil. Satu-satunya keberhasilan yang saya miliki adalah ketika saya bergabung dengan stream video secara terpisah (yaitu videostream1.mp4 dan videostream2.mp4) dan stream audio (yaitu audiostream1.m4a dan audiostream2.m4a) dan kemudian bergabung dengan video dan audio dalam file terakhir. Namun, sinkronisasi hilang untuk paruh kedua video. Konkretnya, ada penundaan audio dan video 1 detik. Setiap saran sangat diterima.
sumber
Jawaban:
Cara terbaik untuk melakukan ini saat ini adalah dengan demuxer concat . Pertama, buat file bernama
inputs.txt
diformat seperti ini:Kemudian, jalankan perintah ffmpeg ini:
Lihat juga gabungan dalam
ffmpeg
FAQ .Saya menyimpan yang berikut di sini untuk kepentingan siapa pun yang menggunakan ffmpeg versi lama.
Versi terbaru dari ffmpeg dapat melakukan ini: Anda harus melakukan remux file ke aliran transport mpeg terlebih dahulu (cukup prosesor-cahaya, karena hanya mengubah format wadah):
Jika itu memunculkan kesalahan tentang h264, Anda mungkin perlu menggunakan:
Anda harus melakukan ini secara terpisah dengan setiap file input. Untuk menyatukan file bersama, gunakan:
Jika itu memunculkan kesalahan tentang aac, Anda mungkin perlu menggunakan
Jika sistem Anda mendukung pipa bernama, Anda dapat melakukan ini tanpa membuat file perantara.
Anda harus melakukan hal berikut dalam tiga terminal virtual terpisah:
Jika output.mp4 sudah ada, ffmpeg ketiga akan menanyakan apakah Anda ingin menimpanya, tetapi akan melakukan ini setelah mengakses FIFO , dan ini akan membuat yang pertama menutup ffmpeg. Jadi pastikan Anda memilih nama yang tidak digunakan untuk file output Anda.
Ini mungkin tidak berfungsi jika file input Anda berbeda - saya percaya bahwa perbedaan dalam bit rate OK, tetapi ukuran frame, frame rate dll harus cocok.
sumber
*** THIS PROGRAM IS DEPRECATED *** This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
adalah pesan yang saya lihat sekarang sedang berjalanffmpeg
avconv
Untuk mp4 satu-satunya solusi yang saya temukan adalah dengan MP4Box dari paket gpac
atau perintah
dengan mencoder dan avconv saya tidak bisa membuatnya bekerja :-(
sumber
Terima kasih untuk skrip dvo. Itu adalah titik awal yang bagus bagi saya. Saya tidak punya masalah dengan menggunakan pipa bernama jadi saya mengadaptasi skrip untuk menggunakannya. Plus saya memperbaikinya untuk bekerja dengan nama file dengan spasi di dalamnya. Output ke pipa bernama tidak "pergi" sampai Anda mulai membaca dari mereka, maka kebutuhan untuk latar belakang tugas remux awal dengan & sebelum panggilan terakhir ke avconv. Plus, jangan lupa untuk menggunakan -c copy, atau Anda akhirnya menyandikan ulang seluruh lot.
sumber
Di Mac (macOS 10.13 High Sierra) saya menggunakan yang berikut ini dengan sukses:
Susun ulang seperti di atas dengan cara yang sama jika perlu (perhatikan bahwa ./ telah dihapus - path menyebabkan ffmpeg untuk melemparkan kesalahan nama file yang tidak aman).
Kemudian saya harus menghapus codec dan bitrate yang ditentukan untuk ffmpeg MacPorts default untuk menyukainya:
sumber
Berikut ini adalah satu-liner yang membuatnya lebih mudah. Itu melakukan semua yang perlu dilakukan untuk akhirnya memberi Anda satu file video yang dihasilkan. Tepuk tangan!
sumber
Terima kasih evilsoup; di sini ada sedikit skrip untuk mengotomatiskan proses, menggunakan yang lebih baru
avconv
.BTW, pipa bernama tidak bekerja untuk saya (output ke mereka macet).
sumber
Telah menikmati kesuksesan besar bersama
Anda mungkin perlu memesan ulang mylist.txt sedikit
ffmpeg versi 2.2.3
sumber