Saya mencoba untuk menggabungkan dua file mp4 menggunakan ffmpeg. Saya ingin ini menjadi proses otomatis, mengapa saya memilih ffmpeg. Saya mengubah dua file menjadi file .ts dan kemudian menyatukannya dan kemudian mencoba untuk menyandikan file .ts. File-file tersebut h264 dan aac dikodekan dan saya berharap untuk menjaga kualitasnya tetap sama atau sedekat mungkin dengan aslinya.
ffmpeg -i part1.mp4 -vcodec copy -vbsf h264_mp4toannexb -acodec copy part1.ts
ffmpeg -i part2.mp4 -vcodec copy -vbsf h264_mp4toannexb -acodec copy part2.ts
cat part1.ts part2.ts > parts.ts
ffmpeg -y -i parts.ts -acodec copy -ar 44100 -ab 96k -coder ac -vbsf h264_mp4toannexb parts.mp4
Sayangnya saya mendapatkan pesan kesalahan berikut yang kembali dari ffmpeg selama penyandian:
[h264 @ 0x1012600]sps_id out of range
[h264 @ 0x1012600]non-existing SPS 0 referenced in buffering period
[h264 @ 0x1012600]sps_id out of range
[h264 @ 0x1012600]non-existing SPS 0 referenced in buffering period
[NULL @ 0x101d600]error, non monotone timestamps 13779431 >= 13779431kbits/s
av_interleaved_write_frame(): Error while opening file
Ini terjadi sekitar setengah jalan melalui pengkodean yang membuat saya berpikir bahwa Anda tidak dapat menggabungkan dua file .t bersama dan membuatnya bekerja.
ffmpeg -safe 0 -f concat -i <(find . -type f -name '*' -printf "file '$PWD/%p'\n" | sort) -c copy output.mkv
(mkv menerima lebih banyak codec daripada mp4, tetapi Anda juga bisa mencobanya dengan mp4). Ini-safe 0
untuk versi ffmpeg terbaru yang mengeluhkan nama file yang tidak aman , dan-type f
hanya untuk daftar file. Saya menambahkan| sort
untuk mengurutkan file berdasarkan abjad; karenafind
membacanya agar disimpan di sistem file. Juga berfungsi untuk file dengan spasi putih.ffmpeg -i "concat:input1|input2" -codec copy output
. Tidak perlu keluar dari karakter pipa.UNTUK FILES MP4
Untuk file .mp4 (yang saya peroleh dari DailyMotion.com: episode tv 50 menit, hanya dapat diunduh dalam tiga bagian, seperti tiga file video .mp4) berikut ini adalah solusi yang efektif untuk Windows 7 , dan TIDAK melibatkan penyandian ulang file.
Saya mengganti nama file (sebagai file1.mp4 , file2.mp4 , file3.mp4 ) sedemikian rupa sehingga bagian-bagiannya dalam urutan yang benar untuk melihat episode tv lengkap.
Kemudian saya membuat file batch sederhana (concat.bat), dengan konten berikut:
File batch , dan ffmpeg.exe , keduanya harus diletakkan di folder yang sama dengan file .mp4 yang akan digabung. Kemudian jalankan file batch. Biasanya diperlukan waktu kurang dari sepuluh detik untuk berjalan.
.
Addendum (2018/10/21) -
Jika yang Anda cari adalah metode untuk menentukan semua file mp4 di folder saat ini tanpa banyak mengetik ulang, coba ini di file batch Windows Anda ( HARUS sertakan opsi- aman 0 ):
Ini berfungsi pada Windows 7, dalam file batch. Jangan coba menggunakannya di baris perintah, karena hanya berfungsi di file batch!
sumber
C:\blah>type mylist.txt<ENTER>
(Jadi mereka melihat isi file itu) Kemudianffmpeg -f concat -i mylist.txt -c copy output.mp4<ENTER>
Juga Anda harus menyertakan referensi trac.ffmpeg.org/wiki/Concatenate (referensi itu bahkan menggunakan nama file yang sama, mylist.txt)-i
parameter. Di Linux saya melakukan ini:ls -1 P1041*.mp4 | sed s/"P"/" file P"/g > mylist.txt
yang bahkan lebih keren daripada pengkodean skrip batch. Lagi pula,-c copy
berkinerja sangat cepat (yang saya tidak sadari) dan ini adalah keajaiban nyata dari jawaban ini.Inilah cara cepat (kurang dari 1 menit) dan tanpa kehilangan untuk melakukan ini tanpa memerlukan file perantara:
"Ls" berisi file-file yang akan digabungkan. "Perl" membuat file concatenation on-the-fly ke dalam pipa. Bagian "-i -" memberi tahu ffmpeg untuk membaca dari pipa.
(catatan - file saya tidak memiliki spasi atau hal-hal aneh di dalamnya - Anda perlu melarikan diri shell yang tepat jika Anda ingin melakukan ide ini dengan file "keras").
sumber
ls Movie_Part_1.mp4 Movie_Part_2.mp4 | perl -ne '$_ =~ s/\n$//; print "file '"'"'$_'"'"'\n"' | ffmpeg -f concat -i - -c copy Movie_Joined.mp4
ls * | perl -ne 'print "file $_"' | ffmpeg -f concat -i - -c copy Movie_Joined.mp4
jika file Anda diberi nama dengan baik dan teratur. Bekerja sangat baik untuk saya di OS X, persis apa yang saya inginkan.ffmpeg -safe 0 -f concat -i <(find . -type f -name '*' -printf "file '$PWD/%p'\n" | sort) -c copy output.mkv
(mkv menerima lebih banyak codec daripada mp4, tetapi Anda juga bisa mencobanya dengan mp4). Ini-safe 0
untuk versi ffmpeg terbaru yang mengeluhkan nama file yang tidak aman , dan-type f
hanya untuk daftar file. Saya menambahkan| sort
untuk mengurutkan file berdasarkan abjad; karenafind
membacanya agar disimpan di sistem file. Juga berfungsi untuk file dengan spasi putih.ffmpeg
untuk membuatnya berfungsi:-protocol_whitelist file,tcp,http,pipe
untuk file MP4:
Jika mereka tidak persis sama (100% codec yang sama, resolusi yang sama, jenis yang sama) file MP4, maka Anda harus trans-kode mereka ke aliran menengah pada awalnya:
CATATAN! : Output akan seperti file pertama (dan bukan yang kedua)
sumber
Saya mencoba menggabungkan tiga
.mp3
file audio menjadi satu.m4a
file dan perintah ffmpeg ini berfungsi.Perintah input:
Arti dari -filter_complex "concat = n = 3: v = 0: a = 1" :
Untuk info lebih lanjut: gunakan
ffmpeg -h full
cetak semua opsi (termasuk semua format dan opsi spesifik codec, sangat panjang)sumber
-f concat -safe 0 -i "file.txt" -c copy -y "OutPut.mp4"
akan concat tetapi ketika beberapa video dengan audio dan beberapa tanpa audio itu tidak berfungsi bagaimana saya bisa memilah ini. Terima kasih -Saya akhirnya menggunakan mpg sebagai format perantara dan berhasil (CATATAN ini adalah contoh berbahaya, -kala 0 akan mengkodekan ulang video ...)
sumber
-sameq
telah dihapus. Gunakan-qscale 0
sebagai gantinya.-sameq
tidak berarti "kualitas yang sama" dan telah dihapus dari ffmpeg seperti yang disebutkan oleh @XavierHo.concat
perintah di ffmpeg, seperti yang dilakukan @rogerdpack di atas.Dokumentasi terperinci tentang berbagai cara penggabungan dalam ffmpeg dapat ditemukan di sini .
Anda dapat menggunakan 'Filter perhatian' untuk penggabungan cepat.
Ia melakukan pengkodean ulang. Opsi ini paling baik bila input memiliki format video / audio yang berbeda.
Untuk Concatenating 2 file:
Untuk Concatenating 3 file:
Ini berfungsi untuk jenis file input yang sama maupun multi.
sumber
ouput.mp4
bitrate video saya secara signifikan lebih rendah daripada bitrate video input videoSaya menemukan operator pipa tidak bekerja untuk saya ketika menggunakan opsi 3 untuk menyelesaikan beberapa MP4 pada Mac dalam jawaban yang diterima.
One-liner berikut berfungsi pada Mac (High Sierra) untuk menggabungkan mp4s, tanpa diperlukan pembuatan file perantara.
ffmpeg -f concat -safe 0 -i <(for f in ./*.mp4; do echo "file '$PWD/$f'"; done) -c copy output.mp4
sumber
Di sini 2 solusi bash murni hanya menggunakan
ffmpeg
dan tidak menggunakanSolusi satu-liner menggunakan
ls
Fungsi yang membutuhkan 0 atau 2+ argumen
Catatan: telah mencoba beberapa solusi di utas ini dan tidak ada yang memuaskan saya
sumber
berdasarkan tanggapan rogerdpack dan Ed999, saya telah membuat versi .sh saya
itu menggabungkan semua
*.mp4
file di folder saat ini kejoined-out.mp4
diuji pada mac.
filesize yang dihasilkan adalah jumlah pasti dari 60 file yang saya uji. Seharusnya tidak ada kerugian. Apa yang saya butuhkan
sumber
ini bekerja untuk saya (di windows)
sebuah contoh...
Python
Menggunakan beberapa kode python untuk melakukannya dengan sebanyak mp4 yang ada di folder (instal python dari python.org, salin dan tempel dan simpan kode ini ke dalam file bernama mp4.py dan jalankan dari cmd yang dibuka di folder dengan python mp4.py dan semua mp4 di folder akan digabungkan)
Versi 2 dengan Python
Diambil dari pos saya di blog saya , ini adalah bagaimana saya melakukannya dengan python:
sumber
Untuk
.mp4
file, saya menemukan itu bekerja lebih baik dan lebih cepat untuk menggunakan alat baris perintah opensource:mp4box
. Maka Anda dapat menggunakannya dengan cara ini:Unduh di sini untuk sebagian besar platform: https://gpac.wp.imt.fr/mp4box/
sumber
Berikut ini skrip yang saya buat untuk menggabungkan beberapa GoPro mp4 menjadi 720p mp4. Semoga ini bisa membantu.
sumber
Dari dokumentasi di sini: https://trac.ffmpeg.org/wiki/Concatenate
Pendekatan ini bekerja pada semua platform.
Saya membutuhkan kemampuan untuk merangkum ini dalam skrip lintas platform, jadi saya menggunakan
fluent-ffmpeg
dan menghasilkan solusi berikut:sumber
sumber
Menggabungkan semua file mp4 dari direktori saat ini
Saya pribadi tidak suka membuat file eksternal yang harus saya hapus setelah itu, jadi solusi saya mengikuti yang mencakup daftar penomoran file (seperti
file_1_name, file_2_name, file_10_name, file_20_name, file_100_name
, ...)sumber
Setelah berbagai upaya di bawah ini skrip bekerja untuk saya di windows 10 PowerShell.
Di sini dua baris pertama membuat file teks temp.txt yang memiliki konten berikut
Baris ke-3 dan ke-4 memeriksa apakah ffmpeg tersedia di path dan membuat "bergabung.mp4"
Perbedaan utama dari jawaban lain adalah sebagai berikut
untuk file mp4 saya di atas berfungsi, Anda mungkin perlu menggunakan alternatif lain seperti di bawah ini tergantung pada encoding video Anda.
Semua kemungkinan filter Bitstream dapat ditemukan di https://ffmpeg.org/ffmpeg-bitstream-filters.html
sumber
Inilah metode saya untuk bergabung dengan direktori yang penuh dengan file MP4 menggunakan substitusi perintah dan filter video concat (ini akan menyandikan ulang) - mengira orang lain akan dapat menggunakan liner ini, terutama jika Anda memiliki banyak file (saya hanya bergabung dengan 17 file dalam sekali gerakan):
NB perintah ini menggabungkan file-file Anda dengan urutan nama mereka (yaitu urutan yang sama seperti yang disajikan jika Anda menjalankan
ls *.mp4
) - dalam kasus saya, mereka masing-masing memiliki nomor trek, sehingga bekerja dengan baik.sumber
Protokol penting yang dijelaskan di sini; https://trac.ffmpeg.org/wiki/Concatenate#protocol
Ketika diimplementasikan menggunakan pipa bernama untuk menghindari file menengah
Sangat cepat (baca: instan), tidak ada bingkai yang terjatuh, dan berfungsi dengan baik.
Ingatlah untuk menghapus file pipa yang dinamai dan ingat untuk memeriksa apakah video tersebut H264 dan AAC yang dapat Anda lakukan dengan adil
ffmpeg -i filename.mp4
(periksa h264 dan aac menyebutkan)sumber
Jawaban yang diterima dalam bentuk skrip PowerShell yang dapat digunakan kembali
sumber