Bagaimana cara menggabungkan beberapa (lebih dari dua) video di Ubuntu?

39

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/vlcdan 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.

Dhruv Singal
sumber
2
Tolong jangan ajukan pertanyaan yang sama di situs multi-SE: superuser.com/questions/928548/…
Maythux
Bisakah Anda memposting secara spesifik apa yang telah Anda coba sejauh ini?
ohaal
1
@ohaal Saya mencoba menggunakan berbagai metode gabungan yang diberikan ffmpeg, termasuk filter dan protokol file. Saya juga mencoba menggunakan concatfitur cvlc/vlc. Saya juga mencoba concatfitur mencoder. Semua ini bekerja sebagian. Ini akhirnya membantu saya menyelesaikan masalah ini.
Dhruv Singal
Ya, Anda sudah menyebutkan alat, maksud saya adalah perintah sebenarnya yang Anda jalankan. Juga akan lebih bagus jika Anda bisa memasukkan perintah yang akhirnya menyelesaikannya untuk Anda (dalam jawaban Anda), untuk pengunjung masa depan.
ohaal
Aah, aku mengerti maksudmu. Sayangnya, saya tidak dapat membuat daftar perintah karena nomor belaka. Perintah yang memecahkan masalah saya adalah inimelt {input-sequence} -consumer avformat:{output-name} acodec=libmp3lame vcodec=libx264
Dhruv Singal

Jawaban:

41

Saya menggunakan mkvmergeuntuk menggabungkan beberapa file MP4 menjadi satu:

mkvmerge -o outfile.mkv infile_01.mp4 \+ infile_02.mp4 \+ infile_03.mp4
Szabolcs Spindler
sumber
3
Lebih baik menggunakan ekstensi .mkvuntuk file output, karena merupakan wadah Matroska terlepas dari ekstensi apa yang Anda berikan.
haridsv
Berikut cara memasang mkvmerge: tipsonubuntu.com
Morgoth
Hanya perintah ini mkvmerge yang berfungsi. Semua yang ffmpeg gagal dengan audio yang digeser setidaknya.
42n4
25

Anda dapat melakukannya menggunakan ffmpeg:

ffmpeg -i concat:"input1.mp4|input2.mp4" output.mp4

referensi dan info lebih lanjut

Maythux
sumber
2
Saya mencoba melakukan itu. Masalah dengan ini adalah bahwa itu tidak memberi keluar yang tepat. 1. Trek audio kacau. 2. Ada beberapa gangguan di trek video.
Dhruv Singal
Saya menggunakannya lebih dari sampel, hasilnya berkualitas tinggi, mungkin kualitas video sumber Anda masalahnya?
Maythux
Kamu mungkin benar. Ini memecahkan masalah: askubuntu.com/a/637179/420614
Dhruv Singal
2
Jangan gunakan protokol khusus untuk menyatukan MP4. Ini hanya bekerja dengan format tertentu yang sebagian besar pengguna umum tidak temui. Sebagai gantinya gunakan concat demuxer atau filter concat .
Logan
Saya mencoba ffmpeg dengan 2 file mp4 masing-masing 30 menit. Saya mendapat file output dengan panjang 7 jam.
Guus
7

Ini menyelesaikan masalah: https://stackoverflow.com/a/22324018/5014767

meltadalah utilitas perintah baris yang bagus untuk ini. Sini halamannya

Edit dari komentar: Perintah yang memecahkan masalah saya adalah ini melt {input-sequence} -consumer avformat:{output-name} acodec=libmp3lame vcodec=libx264

Dhruv Singal
sumber
4

Saya menulis skrip shell kecil untuk menyelesaikan MP4 tanpa transcoding menggunakan ffmpeg.

for f in $(ls *.MP4); do
    ffmpeg -i $f -c copy -bsf:v h264_mp4toannexb -f mpegts $f.ts
done

CONCAT=$(echo $(ls *.ts) | sed -e "s/ /|/g")

ffmpeg -i "concat:$CONCAT" -c copy -bsf:a aac_adtstoasc output.mp4

rm *.ts

Ini membuat file antara dalam wadah MPEG dan kemudian menggabungkannya menjadi MP4.

RawwrBag
sumber
Penting untuk dicatat bahwa skrip ini akan gagal jika salah satu nama file mengandung spasi atau, dalam beberapa kasus, karakter khusus. Untuk loop, lebih baik menggunakan for f in *.MP4tanpa menggunakan ls. (Anda harus selalu menghindari penggunaan lsdalam 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.
Paddy Landau
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 sarankan CONCAT=$(echo $(ls -v *.ts) | sed -e "s/ /|/g")ini akan memastikan pesanan .
tisaconundrum
2

Buat file files.txt dengan semua file yang Anda ingin gabungkan dalam bentuk berikut (baris yang dimulai dengan # diabaikan):

# this is a comment
file 'file1.mp4'
file '/path/to/file2.mp4'
file 'file3.mp4'

Perhatikan bahwa ini bisa berupa jalur relatif atau absolut. Kemudian Anda dapat melakukan streaming menyalin atau menyandikan ulang file Anda:

ffmpeg -f concat -safe 0 -i files.txt -c copy output.mp4
ShaDeRzz
sumber
0

Script saya, murni dalam bashdanffmpeg . Mengkode ulang file yang diberikan pada baris perintah menjadi satu.

Membutuhkan file dengan resolusi yang sama. Menerima rotasi metadata berbeda, yang ffmpeg concat:tidak.

rm ffmpeg-concat-output.mkv

FILE_COUNT=$#
INPUTS=""
FILTER=""
INDEX=0
for FNAME in $@; do
    echo "Processing ${FNAME}"
    INPUTS="${INPUTS} -i $FNAME"

    if [ -z "${FILTER}" ]; then
        FILTER="[$INDEX:v:0] [$INDEX:a:0]"
    else
        FILTER="${FILTER} [$INDEX:v:0] [$INDEX:a:0]"
    fi
    let INDEX+=1
done

COMMAND="ffmpeg ${INPUTS} \
    -filter_complex '${FILTER} \
        concat=n=${INDEX}:v=1:a=1 [v] [a]' \
    -map '[v]' -map '[a]' \
    ffmpeg-concat-output.mkv"

#   -af 'volume=15dB' # won't work with -filter_complex

bash -c "${COMMAND}"
Victor Sergienko
sumber
0

Saya membuat skrip Python yang, menggunakan moviepy , dapat menggabungkan juga subsegmen (berguna jika Anda ingin misalnya menghapus beberapa bagian dari video).

Gunakan dengan:

vcat -i inputfile1,inputfile2[start-end],... -o <outputfile>
Antonello
sumber
-1

Selain jawaban Maythux, dari :

Beberapa wadah multimedia (MPEG-1, MPEG-2 PS, DV) memungkinkan seseorang untuk menggabungkan video hanya dengan menggabungkan file yang mengandungnya.

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:

cat video1.ext video2.ext video3.ext > video4.ext
kos
sumber
1
Saya mencoba ini tetapi hanya mengembalikan video pertama sebagai output. Saya membaca di suatu tempat bahwa itu tidak berhasil, meskipun saya tidak ingat alasan di balik ini.
Dhruv Singal
@ DhruvSingal Ya, saya dapat mengkonfirmasi ini, saya sudah mencoba ini pada dua video MP4 dengan encoding video / audio yang sama persis dan karena Anda saya hanya bisa menelusuri video pertama. Yang tampaknya masuk akal, namun saya cukup yakin bahwa saya pernah melakukan ini sebelumnya dengan beberapa video MP4. Mungkin memori tidak berfungsi dengan baik di sini, atau ada persyaratan lain agar ini berfungsi. Saya ingin meneliti hal ini karena saya tertarik juga, jika saya menemukan sesuatu, saya akan memperbarui jawabannya dan memberikan komentar
kos
Kami entah bagaimana perlu mengubah metadata di awal video pertama untuk mencakup seluruh panjang film gabungan, dan hal-hal lain mungkin. Hanya beberapa file mpeg4 yang memungkinkan saya melihat metadata ..
Ken Mollerup