ffmpeg komut satırında ffmpeg ile iki mp4 dosyasına katılın


29

Aşağıdaki komutu kullanarak birden fazla dosyaya başarıyla katılabilirim:

ffmpeg -f concat -i input.txt -codec copy output.mp4

Bu komutla ilgili tek sorun, input.txt adlı metin dosyasından dosya yollarını aşağıdaki içerikle okumanız gerektiğidir :

file 'C:\Users\fabio\Downloads\Super\Sharks\01.mp4'
file 'C:\Users\fabio\Downloads\Super\Sharks\02.mp4'
file 'C:\Users\fabio\Downloads\Super\Sharks\03.mp4'

Bir dosyadan dosya yollarını okumak zorunda kalmadan aynı hedefe ulaşmanın bir yolu var mı? Şanssız olarak aşağıdakileri denedim:

ffmpeg -f concat -i file "C:\a\b\01.mp4" file "C:\a\b\02.mp4" -codec copy output.mp4
ffmpeg -f concat -i "C:\a\b\01.mp4" "C:\a\b\02.mp4" -codec copy output.mp4

Farklı bir komut kullanmam gerekiyor mu?


Yanıtlar:


37

2019 Güncellemesi:

Yorumlarda belirtildiği gibi, Yığın Taşması, birleştirme için kullanılabilir seçeneklerin harika bir açıklamasına ve kullandığınız dosya türlerine bağlı olarak hangi yöntemin kullanılacağına dair bir tartışmaya sahiptir:

İki MP4 dosyasını FFmpeg kullanarak nasıl birleştirebilirim?

Orijinal 2016 Cevabı:

Dosyaları birleştirmek için concat protokol yöntemini kullanabilmeniz gerekir :

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

Buna ek olarak, FFmpeg kılavuzu, MP4 dosyaları için kayıpsız bir şekilde birleştirmek için özel olarak bir yöntemi tartışır, ancak geçici dosyalar (veya adlandırılmış kanallar) oluşturmanızı gerektirir:

ffmpeg -i input1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate1.ts
ffmpeg -i input2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate2.ts
ffmpeg -i "concat:intermediate1.ts|intermediate2.ts" -c copy -bsf:a aac_adtstoasc output.mp4

1
İlk komut benim için bir tereyağı gibi çalıştı ... 6 mp4 dosyalarımı çıkış dosyasına (yaklaşık 239 MB) kapatması 2 ila 3 saniye sürdü.
Sachin

22
İlk komut benim için işe yaramadı. Sadece ilk dosyayı kopyaladı.
Luis A. Florit

3
Bu işe yaramaz, sadece ilk dosyayı kopyaladı output.mp4.
crmpicco

2
Dosya düzeyinde birleştirme MP4 için çalışmaz, bu nedenle concat protokolü bu biçim için önerilmez ve genellikle çalışmaz.
llogan

1
@brasofilo Bağlantı için teşekkürler. Bu çok gecikmiş, ancak cevabı insanları bu yönde gösterecek şekilde güncelledim.
Carson Darling

5

Ffmpeg stdoutlistesinin çıktısını alıp listeden okuyarak dosyayı listeyle değiştirebilirsiniz stdin:

(echo file 'a.mp4' & echo file 'b.mp4') | ffmpeg -protocol_whitelist file,pipe -f concat -safe 0 -i pipe: -vcodec copy -acodec copy "result.mp4"

Mac OS 10.12.6'da ffmpeg 2.4.3-tessus sürümü kullanıldığında, bu sadece bir hata verir: "Tanınmayan seçenek 'protokol_beyazı' '. Protocol_whitelist seçeneği olmadan, sadece ikinci MP4 dosyasının bir kopyasını oluşturuyor gibi görünüyor.
James

2

Hayır, ffmpeg concat demuxer'ı tek bir komut satırında kesmek olmadan kullanmanın bir yolu yok gibi görünüyor. Girdi metin dosyasını dosya listesiyle oluşturmanız gerekir. Bunun garip olduğunu düşündüm, belki birisi bunu daha sonraki bir tarihte FFMpeg'e ekleyecektir.

Bu soruya kabul edilen cevap OP'nin istediği concat demuxer değil concat protokolünü kullanır.


1
Aslında var. Stdin.
Qwertiy

concat protokolü genel başlık gerektiren MP4 veya başka bir formatta kullanılmamalıdır.
llogan

1

Komutu değiştirmeden yine de bir komut dosyasında yapabilirsiniz. Gibi bir şey:

echo "file fname1" >$$.tmp    #single redirect creates or truncates file
echo "file fname2" >>$$.tmp   # double redirect appends
echo "file fname3" >>$$.tmp   # do as many as you want.

ffmpeg -f concat -i $$.tmp -codec copy output.mp4

rm $$.tmp  # just to clean up the temp file. 
           # For debugging, I usually leave this out.

$$ komutu çalıştıran kabuğun pidine genişler, böylece her çalıştırdığınızda dosya adı farklı olur. isterseniz $$ .txt kullanabilirsiniz. Veya başka bir şey...

Ayrıca, dosyaya bir grup veri eklemek için bu dosyaları kullanabilirsiniz:

cat <<EOF >$$.tmp
file fname1
file fname2
file fname3
EOF

bash Değişken değiştirme çalışır, böylece dosyanın içeriğini programlı olarak belirleyebilirsiniz, düzeltilmesi gerekmez. Döngüler için her zaman bu tür şeyler yerleştirdim. Son olarak, yönlendirme yukarıdakiyle aynı şekilde çalışır, bu yüzden> $$. Tmp kısalır, sonra yazar, >> $$. Tmp ekler.


2
Soru, "Bir dosyadan dosya yollarını okumak zorunda kalmadan aynı hedefe ulaşmanın bir yolu var mı?" Tek yaptığınız, dosya yollarını bir dosyaya yazmak için bir yol sağlamaktır (dosya yollarını dosyadan okumadan önce). Bu soruya cevap vermiyor.
Scott
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.