En azından FFmpeg 2.8.x'te (ama oldie de çalışmalıdır) , seçenek olarak argüman olarak ve filtreleri lavfi
kullanarak girdi formatı ve karmaşık filtre grafiği kullanabilirsiniz .movie
setpts
-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ı. setpts
PTS 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_loop
sunuldu. İ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.