Ffmpeg ile giriş videosunu tekrarla/tekrarla?


34

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ğundadır, 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.

38

Concat demuxer

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

  1. Bir metin dosyası yapı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. O zaman 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 el ile yapmanız gerekmezlist.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 mermilerle,list.txttamamen dosyalayın.Ö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

Kullanarak örnekloop filter4 kez döngü yapmak için, her döngü 75 karedir, her döngü girişin ilk 25 karesini atlar:

ffmpeg -i input -filter_complex loop=3:75:25 output
  • Filtreleme yeniden kodlama gerektirir.
  • Bu filtreplaces all frames into memory.
  • kullanmaloop=34 kez dönecek.
  • Sonsuz döngü kullanabilmek 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 bakınızffmpeg -h filter=loop.

film filtresi

movie filterbir döngü seçeneği var.GörmekanswerMonah Tuk tarafından aşağıda.Filtreleme yeniden kodlama gerektirir.Ses için amovie filtresini kullanın.


-stream_loopseçenek

Görmekansweraşağıda Thingy veanswerMulvya tarafından.Bu seçeneğin buggy olduğuna dikkat edin (hata raporlarına bakın).#6121ve#5719) ve sizin için çalışmayabilir.Mulvya tarafından # 6121 nolu bilette belirtildiği gibi, bir geçici çözüm önce MKV veya TS’e yeniden mux-stream_loopsonraki komutta.


-loopseçenek

-loopseçenekimage file demuxervegif muxer, 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-t 30çıkış süresini 30 saniye ile sınırlar:

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
  0

Bu mp4 dosyaları ile iyi çalışıyor mu? 28 eki. 142014-10-28 19:08:12

+2

Ben bu hatayı alıyorum>><({1..4} 'te; için; "% s' \ n" girişini yapın. İnput.mp4; done) -bash:/dev/fd/63: İzin verilmedi 09 kas. 152015-11-09 18:46:50

  0

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


14

En azından FFmpeg 2.8.x'de (ama oldie de işe yaramalı) kullanabilirsiniz.lavfigiriş formatı ve karmaşık filtre grafiği kullanarakmovievesetptsiçin bir argüman olarak filtreler-iseçeneğ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ırloop=bağımsız değişkenler 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 gerekli olan ikinci ve sonraki PTS filtreleri tekrar eder, 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 yeni giriş seçeneğinde-stream_loopinroduced.İ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) kaldırmanız gerekir-c copyçok.Yalnızca bit akımı filtreleri kodlanmış paketlerle ilgilenebilir, ancak PTS'yi düzeltmek için herhangi bir 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ş: PTS limitsiz giriş dosyası için konteynır kullanın (akış konteyneri).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ı, kod çözücü ş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. 18 kas. 152015-11-18 08:35:28

+1

Stream_loop belgelerine göre "Döngü 0 döngü yok, döngü -1 sonsuz döngü anlamına gelir." 18 kas. 152015-11-18 08:36:47

  0

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 dokümanlar görüyorum galiba :-) 18 kas. 152015-11-18 13:43:11

  0

Benimki geçerli MP4'lerdi ama benim kullandıkları paylaşamıyorum. Bir tane ffmpeg kullanarak üretebilir ve sonra bunu kullanabilirsiniz.Çalışıyorsa konsol çıktısını yapıştırın. 18 kas. 152015-11-18 14:56:17

+1

Unuttum: kod çözmeyi varsayan filtreler (kod çözme/kodlama).Tasarım gereği.Bu yüzden '-c copy' dosyasını kaldırmalısınız.Cevap düzeltildi. 18 kas. 152015-11-18 16:48:45

+1

Bilmeniz güzel, ancak oluşturmak için büyük bir döngü varsa, bu önemli bir sınırlama. 18 kas. 152015-11-18 17:02:13

  0

PTS sorununu yeniden kodlamadan düzeltmek için stream_loop ve WA hakkında bilgi ekleyin.FFmpeg> = 2.8.2 gerekli. 18 kas. 152015-11-18 17:22:40

  0

@MonahTuk Döngü filtresinin stream_loop'tan (daha önce denediğim herhangi bir dosya için kısa bir duraksamaya neden olur) çok daha iyi çalıştığını düşünüyorum, bir istisna dışında: döngü filtresini eklediğim anda ses kayboluyor mu? 22 haz. 172017-06-22 12:56:13

  0

@MikeVersteeg, dosyaları kontrol etmelisin.Zaman zaman dosyadaki farklı parçaların biraz farklı uzunlukları vardır ya da kaymaları etkileyebilir.Asla FFmpeg sürümlerinde sorunlar da ortaya çıkabilir.Ayrıca, çoğu çalışma durumu - giriş ve çıkış olarak MPEG TS konteynerini kullanın. 23 haz. 172017-06-23 00:05:28


10

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

ffmpeg -stream_loop -1 -i input.mp4 -c copy -fflags +genpts output.mp4
+2

En hızlı yöntem gibi görünüyor 23 oca. 172017-01-23 17:43:24

  0

En hızlı yöntem bir ifadedir, bu yöntem birkaç saniyede bir çok saate kadar video rampası yapar. 13 şub. 182018-02-13 23:28:34


0

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 çıkışı.mp4

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

  0

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. 11 mar. 172017-03-11 06:36:50

  0

Mulvya’nın Dokümanlar’da açıklanan davranıştan farklı olduğunu test ettiği için teşekkür ederiz: https://ffmpeg.org/ffmpeg.html#Description - "-i -i/tmp/test% d kullanarak Dosya adlarında benzerlik varsa .mp4 "(ve diğ.) de mümkündür. 11 mar. 172017-03-11 17:28:19