Ffmpeg ile giriş videosunu tekrarla / tekrarla?


52

Sadece bir mp4 videoyu ffmpeg ile döngü içine almak ve geçerli ayarları ve kodeki tutmak istiyorum.

Örneğin input.mp4 0:10 uzunluğundaysa ve bunu 4 kez tekrarlamak isterim, böylece output.mp4 0:40 uzunluğunda, bunu yapmak için aşağıdaki komut satırını nasıl değiştirebilirim?

ffmpeg -i input.mp4 -c copy output.mp4

Denedim...

ffmpeg -loop 4 -i input.mp4 -c copy output.mp4

... ancak "Seçenek döngüsü bulunamadı" hatası alıyorum.


Quicktime 7 pro ve mov konteyner kullanın. Böylece, bir kaynak kaynaklı olandan daha büyük bir dosya boyutu elde edemezsiniz.
Дмитрий Мышков

Yanıtlar:


69

Concat demuxer

Bu, yeniden kodlamaya gerek duymadan bir girişi döngülendirmenize izin verir.

  1. Bir metin dosyası hazırlayın. Örnek bir metin dosyasının içeriği 4 kez tekrarlanır.

    file 'input.mp4'
    file 'input.mp4'
    file 'input.mp4'
    file 'input.mp4'
    
  2. Sonra koş ffmpeg:

    ffmpeg -f concat -i list.txt -c copy output.mp4
    

Linux kullanıcıları için

Bu örnek yukarıdakiyle aynıdır ancak manuel olarak yapmanız gerekmez list.txt:

for i in {1..4}; do printf "file '%s'\n" input.mp4 >> list.txt; done
ffmpeg -f concat -i list.txt -c copy output.mp4

En sık kullanılan modern kabuklarla, list.txtdosyanın oluşturulmasını tamamen önleyebilirsiniz . Örneğin, bash ile:

ffmpeg -f concat -i <(for i in {1..4}; do printf "file '%s'\n" input.mp4; done) -c copy output.mp4

Ayrıca bakınız:


döngü filtresi

4 kez döngü yapmak için döngü filtresini kullanan örnek , her döngü 75 karedir, her döngü girişin ilk 25 karesini atlar:

ffmpeg -i input -filter_complex loop=loop=3:size=75:start=25 output
  • Veya stenoyu kullanın: loop=3:75:25
  • Filtreleme yeniden kodlama gerektirir.
  • Bu filtre tüm kareleri belleğe yerleştirir .
  • Kullanma loop=34 kez tekrarlanacaktır.
  • Sonsuz döngü kullanmak için -1.
  • Döndürülecek kare sayısını listelemelisiniz (yukarıdaki örnekte 75 ile gösterilmiştir). Maksimum değer 32767.
  • Ayrıca bkz ffmpeg -h filter=loop.

film filtresi

Film filtresi bir döngü seçeneği vardır. Bkz cevap Monah Tuk aşağıda. Filtreleme yeniden kodlama gerektirir. Ses için amovie filtresini kullanın.


-stream_loop seçenek

Bkz cevap Thingy aşağıda ve cevap Gyan tarafından.

Bu seçenek olduğunu unutmayın idi arabası (bkz hata raporları # 5719 , # 6121 ve # 7043 ) çok eski yapılar oluşturmak içindir çalışmayabilir (şey FFmpeg 4.0.x sürüm dalı içeren daha eski 2018 06-27). Eski binaların kullanıcıları için, # 6121 no'lu bilette mulvya tarafından belirtildiği gibi, bir geçici çözüm, önce MKV veya TS e tekrar mux, sonra bir -stream_loopsonraki komutta kullanmaktır.


-loop seçenek

Bu -loopseçenek, görüntü dosyası demuxer ve gif muxer'a özgüdür , bu nedenle tipik video dosyaları için kullanılamaz, ancak bir dizi giriş görüntüsünü sonsuz biçimde döngülemek için kullanılabilir. Bu örnek tekrar tekrar dönecek, ancak -t 30çıkış süresini 30 saniye ile sınırlayacaktır:

ffmpeg -loop 1 -i %03d.png -t 30 output.mkv

Veya bir GIF çıktısını döngülemek için:

ffmpeg -i input -loop 3 output.gif

Bu mp4 dosyaları ile iyi çalışıyor mu?
Thomas King

3
Bu hatayı alıyorum> <(for i in {1..4}; do printf "file '%s'\n" input.mp4; done) -bash: /dev/fd/63: Permission denied
JZ11

1
@jamesfzhang - Bunun nedeni, dosya için mutlak bir yola ihtiyaç duymanız gerektiğidir (burada açıklandığı gibi: trac.ffmpeg.org/wiki/Concatenate ). Bunu yerine getirmek için şunu yazabilirsiniz: ffmpeg -safe 0 -f concat -i <({1..4} 'deki i için; "$ PWD' / '% s' \ n" input.mp4; ) -c copy output.mp4
Plenus Franckly

1
Bana gelince, bu 4 kez şöhretleri atlamadan tam zamanlı videoyu tekrarlamak için çalışıyorffmpeg -i video.mp4 -filter_complex "loop=4:32767" output.mp4
Vlad

Bu sayı 4 yaşında ve hiç kimse bu -stream_loopbölümde ikinci sayıya olan bağlantının ilk biletle aynı bilete işaret ettiğini farketmedi ...
Leonid Usov

15

En azından FFmpeg 2.8.x'te (ama oldie de çalışmalıdır) , seçenek olarak argüman olarak ve filtreleri lavfikullanarak girdi formatı ve karmaşık filtre grafiği kullanabilirsiniz .moviesetpts-i

Bir sonraki komut sizin için bu işi yapıyor:

ffmpeg -re -f lavfi -i "movie=filename=input.mp4:loop=0, setpts=N/(FRAME_RATE*TB)" output.mp4

Sıfır loop=argümanları sonsuzluk döngüsü anlamına gelir. Değerler daha büyük sıfır kümeleri tekrarlama sayıları. setptsPTS ayarlaması için ikinci ve daha sonraki tekrarlar için gerekli filtreler tekrarlanır, aksi halde çoğu çıkış muxeri monotonik olmayan PTS artışıyla başarısız olur: döngü PTS'yi yeniden hesaplamaz.

Unutmayın ki, çerçevelerin kod çözme / kodlama olmadan bypass çerçevelerinin kullanılması imkansızdır: tasarım filtreleri yalnızca kod çözülmüş çerçevelerle ilgilidir.

FFmpeg 2.8.2'de yeni girdi seçeneği -stream_loopsunuldu. İlk önce daha basit çalıştığını düşünüyorum ve kod dönüştürmeden kopya içeriğine izin veriyor:

ffmpeg -re -stream_loop -1 -i input.mp4 -c copy -y output.mp4

Ancak PTS'yi yeniden hesaplamaz ve çıktı dosyası yanlıştır. PTS'yi düzeltmek için filtre eklerseniz (bkz. setpts) Siz de kaldırmalısınız -c copy. Yalnızca bit akımı filtreleri kodlanmış paketlerle ilgilenebilir, ancak PTS'yi düzeltecek bit akımı filtresi yoktur (bkz: https://ffmpeg.org/ffmpeg-bitstream-filters.html )

Her durumda, ikinci geçişte ffmpeg hata ile başarısız olur:

input.mp4: Resource temporarily unavailable

Benim için bilinen iş çevresi : PTS sınırı olmayan girdi dosyası için konteyner kullanın (akış kabı). Bunlardan biri, beni tanıyor, MPEG-TS. Böylece MP4 dosyanızı MPEG-TS dosyasına dönüştürebilirsiniz:

ffmpeg -i input.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts input.ts

Sonsuzluk dosyasını oluşturmak için bir sonraki komutu kullanın:

ffmpeg -re -stream_loop -1 -i input.ts -c copy -strict -2 -bsf:a aac_adtstoasc -y output.mp4

(bit akımı filtreleri yalnızca gerektiğinde kullanılmalıdır, örneklerimde gerekli olmalıdır)

Bu durumda FFmpeg> = 2.8.2 gereklidir.


1
Bu komutu çalıştırmak bana hata veriyor: "[mp4 @ 00000000053fa1a0] # 0 akışında codec rawvideo etiketi bulunamadı, codec şu anda kapta desteklenmiyor". Girişten önce -vcodec h264 eklersem, bu hata kaybolur, ancak kodlayıcı çıkmaz. Sıfır olmayan bir döngü sayısı sağlamak, çok fazla hata üretir ancak çıkar. Dosya geçerli bir çıktı değil.
Gyan

1
Stream_loop belgelerine göre "Döngü 0 döngü yok, döngü -1 sonsuz döngü demektir" diyor.
Gyan

Yanlış giriş dosyaları gibi görünüyor. Bunu paylaşmaktan memnun musun? "Döngü 0 döngü yok, döngü -1 sonsuz döngü anlamına gelir." - Eski doktorları görüyorum galiba :-)
Monah Tuk

1
Unuttum: kod çözmeyi varsayan filtreler (kod çözme / kodlama). Tasarım gereği. Yani kaldırmalısın -c copy. Cevap düzeltildi.
Monah Tuk

1
Bilmeniz güzel, ancak oluşturmak için büyük bir döngü varsa, bu önemli bir sınırlamadır.
Gyan

14

Ffmpeg 2.8.4 ile aşağıdaki komut, ffmpeg işlemi durdurulana kadar input.mp4'ün yinelenen bir kopyası olan output.mp4'ü oluşturur:

ffmpeg -stream_loop -1 -i input.mp4 -c copy output.mp4

Bu komut kendiliğinden sona ermeyecek ve çıktı dosyası sonsuz olarak büyüyecek.


2
En hızlı yöntem gibi görünüyor
josef

2
En hızlı yöntem bir belirsizliktir, bu yöntem birkaç saniyede bir çok saate kadar video rampası yapar.
SleighBoy

Bu çok uygun bir yöntemdir, çünkü tekrar eden çizgilerle bir dosya oluşturmaya gerek yoktur.
Markus Zeller

-1

S: "... bunu yapmak için aşağıdaki komut satırını nasıl değiştirebilirim? Ffmpeg -i input.mp4 -c copy output.mp4"?

C: Komutların hangi versiyonla çalıştığı problemlerini önleyen basit yöntem, 'önemsiz çözüm':

ffmpeg -i input.mp4 -i input.mp4 -i input.mp4 -i input.mp4 -c kopya çıktısı.mp4

Ayrıca bakınız: birçok örnek için https://trac.ffmpeg.org/wiki/Concatenate .


2
Bu herhangi bir birleştirme yapmaz . Concat yöntemlerinden en az birinin kullanılması gerekir: protokol, filtre veya ayırıcı. Bu komutta, ffmpeg'in otomatik eşlemesi girişler arasından bir video, bir ses ve bir altyazı akışı seçecektir. Özdeş olduklarından, OP'nin ilk komutuna eşdeğerdir.
Gyan

Mulvya’nın Dokümanlar’da açıklanan davranıştan farklı olduğunu test ettiği için teşekkür ederiz: ffmpeg.org/ffmpeg.html#Description - "-i -i /tmp/test%d.mp4" kullanarak Dosya adlarında benzerlik varsa ( ve diğerleri al) da mümkündür.
Rob
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.