Ffmpeg ile MP4 videonun kare hızını değiştirme


8

Ben mp4 formatında bir kare oranı .33(3 saniye için 1 kare) ile bir video var . Kare hızını 5 kare / sn'ye yükseltmek istiyorum. Aşağıdaki komutu denedim ama hiçbir şey yapmaz:

ffmpeg -i <input.mp4> -r 5 <output.mp4>

Neden ffmpeg'in -rseçeneği görmezden geldiğine dair bir fikrin var mı?


Bir videoyu çoğaltmak / düşürmek yerine bir videoyu hızlandırmaya / yavaşlatmaya çalışıyorsanız bkz. Superuser.com/questions/854753/… ve / veya askubuntu.com/questions/370692/…
Peter Cordes

Yanıtlar:


7

Bunun eski bir soru olduğunu biliyorum ama şu anki cevapların hiçbiri önerilen yol değil.

Kayıpsız (video) yeniden düzenleme

Açıklamalarda belirtildiği gibi Video gelmez nerede bunu yapmanın bir yolu yoktur değil yeniden kodlanmış olmalıdır. Bu gerektirir remuxing geri bir MP4 içine remuxing sonra farklı containter biçim MKV dosya ve. Bir videoyu saniyede 12 kare olarak değiştiren bir örnek:

mkvmerge --default-duration 0:12fps --fix-bitstream-timing-information 0 original-video.mp4 -o temp-video.mkv
ffmpeg -i temp-video.mkv -c:v copy slow-video.mp4

Video ses içeriyorsa, perdeyi değiştirmeden bunu yavaşlatabilirsiniz, ancak kayıpsız bir dönüşüm değildir . Aşağıdaki örnek, kaynak videonun 24 kare / saniye olduğunu varsayar; böylece ffmpeg'in atempo filtresi kullanılarak sesin yarı (0.5) hıza düşürülmesi gerekir .

mkvmerge --default-duration 0:12fps --fix-bitstream-timing-information 0 original-video.mp4 -o temp-video.mkv
ffmpeg -i temp-video.mkv -c:v copy -c:a aac -filter:a "atempo=0.5" slow-video-with-audio.mp4

FFMPEG Wiki Kılavuzu

Bu ffmpeg wiki'nin rehberliğidir . Tüm bu seçeneklerin videonun yeniden kodlanmasını gerektirdiğini unutmayın.

Videoyu hızlandırma / yavaşlatma

Bir video akışının hızını, ayarlar video filtresini kullanarak değiştirebilirsiniz. Aşağıdaki örneklerde ses akışının değiştirilmediğini, bu nedenle ideal olarak -an ile devre dışı bırakılması gerektiğini unutmayın.

Videonun hızını iki katına çıkarmak için şunları kullanabilirsiniz:

ffmpeg -i input.mkv -filter:v "setpts=0.5*PTS" output.mkv

Filtre, her video karesinin sunum zaman damgasını (PTS) değiştirerek çalışır. Örneğin, zaman damgalarında 1 ve 2'de gösterilen iki başarılı kare varsa ve videoyu hızlandırmak istiyorsanız, bu zaman damgalarının sırasıyla 0,5 ve 1 olması gerekir. Bu nedenle, bunları 0,5 ile çarpmamız gerekiyor.

Bu yöntemin istenen hızı elde etmek için çerçeveleri düşüreceğini unutmayın. Girişten daha yüksek bir çıkış kare hızı belirleyerek atlanan karelerden kaçınabilirsiniz. Örneğin, 4 FPS girişinden 4 kata kadar hızlanan bir girişe (16 FPS) gitmek için:

ffmpeg -i input.mkv -r 16 -filter:v "setpts=0.25*PTS" output.mkv

Videonuzu yavaşlatmak için 1'den büyük bir çarpan kullanmanız gerekir:

ffmpeg -i input.mkv -filter:v "setpts=2.0*PTS" output.mkv

pürüzsüz

Minterpolate video filtresi ile yavaş / hızlı videoyu düzeltebilirsiniz. Bu aynı zamanda "hareket enterpolasyonu" veya "optik akış" olarak da bilinir.

ffmpeg -i input.mkv -filter "minterpolate='mi_mode=mci:mc_mode=aobmc:vsbmc=1:fps=120'" output.mkv

Diğer seçenekler arasında slowmoVideo ve Butterflow bulunur. Sesi hızlandırma / yavaşlatma

Atempo ses filtresi ile sesi hızlandırabilir veya yavaşlatabilirsiniz. Ses hızını iki katına çıkarmak için:

ffmpeg -i input.mkv -filter:a "atempo=2.0" -vn output.mkv

Atempo filtresi 0,5 ile 2,0 arasındaki değerleri kullanmakla sınırlıdır (böylece orijinal hızın yarısından daha azına kadar yavaşlatabilir ve girişin iki katından daha fazla olamaz). Gerekirse, birden fazla atempo filtresini bir araya getirerek bu sınırlamayı aşabilirsiniz. Aşağıdakiler ses hızını dört katına çıkarır:

ffmpeg -i input.mkv -filter:a "atempo=2.0,atempo=2.0" -vn output.mkv

Karmaşık bir filtre kullanarak, video ve sesi aynı anda hızlandırabilirsiniz:

ffmpeg -i input.mkv -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mkv

1
Sadece remuxing ile hızlandırmak / yavaşlatmak mümkündür, ancak FFmpeg nasıl yapılacağını bilmiyor . mkv için, mkvtoolnix bunu yapabilir. örneğin mkvmerge --default-duration 0:24000/1001fps --fix-bitstream-timing-information 0 in.mkv -o out.mkv Değişim MKV konteyner üzerinde framerate . MKV'ye remux ve MP4'e geri dönebilir veya MP4 için doğrudan bunu yapan bir araç bulabilirsiniz. videoyu kodlamak çok CPU yoğun ve kayıplıdır, bu yüzden korkunç bir seçenektir.
Peter Cordes

Daha az kaynak yoğunluğu olan kayıpsız bir yaklaşım olduğu için, daha düşük bir kareye yeniden dönüştürmenin tercih edildiği tamamen kabul edildi. Uygulamada MP4'lerle bunu yapmak için iyi bir araç bulamadım. Gerçekten son zamanlarda denemedim, ama bu cevabı ilk yazdığımda MP4-> MKV-> MP4 remuxing yapıyordum ve mkvtoolnix, ffmpeg ve / veya mp4box kullanarak çalışamadım. Önerdiğiniz parametrelerle denemek zorunda kalacağım.
pseudosavant

6

Giriş dosyasının geçerli bir kare hızı yoksa, açıkça ayarlamanız gerekebilir

ffmpeg -r 1 -i input.mp4 -r 24 output.mp4

Bu sadece gerçekten remux gerektiğinde kod dönüştürür. (Aslında videoyu yavaşlatmak / hızlandırmak yerine kareleri çoğaltmak / bırakmak istemiyorsanız.)
Peter Cordes

3

Ben sadece girdi dosyası bir "ham" dosya olarak sınıflandırılırsa yürürlüğe girmek için değişen framerate alabilir:

ffmpeg -r 5 -f h264 -i input.h264 -vcodec copy -an output.mkv

Belirtilmeden -f h264varsayılan olarak 25 fps olur ve değiştirilemez. Görünüşe göre bunun nedeni, akışta herhangi bir kare hızı bilgisinin olmaması ve bunun ffmpeg'in varsayılan kare hızı olmasıdır.

Görünüşe göre -rbir çıkış seçeneği olarak kullandığınızda , kareler çoğaltılır veya düşer, böylece video aynı hızda oynatılır - bu durumda, istediğinizi değil! Ancak, giriş kare hızını yukarıdaki gibi değiştirmek videonun hızlanmasına veya yavaşlamasına neden olur, hiçbir kare kaybolmaz veya çoğaltılmaz.


1
Yararlı cevabım. Burada yeniden kodlama yok
yota

1

Kare hızını değiştirme gibi bir özelliğe "uygunluk" denir ve genellikle bir bitkinin günler geçtikçe dakikalar içinde büyümesini göstermek gibi yavaş hareket veya hızlı ileri üretmek için kullanılır. ffmpeg yeniden kodlamadan kare üzerine yazmaya / değiştirmeye izin vermez . Bunu yaparsa, süre değişecek ve ayrı olarak düzeltilmedikçe ses senkronize olmayacaktır. Ama korkuyorum ki ses .33 karesi ile sizin durumunuzla ilgilenmiyor

Uyumlu olmak istiyorsunuz çünkü sadece kare hızını değiştirmek istiyorsunuz, ancak ffmpeg -rsessizce yok sayargiriş dosyasında kare hızı belirtilmişse. Giriş dosyanız .mp4 biçiminde olduğundan, kendi kare hızı-ryeniden kodlama gerekli olmadığında. Bunun için farklı bir araca ihtiyacınız var: mencoder.

Girdi dosyanızın ses içermediğini varsayarsak - .33 kare hızına sahip herhangi bir video için büyük olasılıkla doğrudur - ihtiyacınız olan şey:

$ mencoder -fps 5 -o <output> -ovc copy -nosound <input.mp4>

Mencoder'ın varsayılan olarak AVI formatında çıktı ürettiğine dikkat edin.


1
Bu yanlış. Bir rçıkış anahtarı olarak belirtilirse, ffmpeg, girdinin kare hızına bakılmaksızın belirtilen kare hızında bir çıktı oluşturur. Eğer rbir giriş anahtarı olarak belirtilirse, Ffmpeg çoğaltmak veya filtre / kodlayıcıya giriş başına saniyede belirtilen sayıda beslemek için gerekli çerçeveleri düşecektir.
Gyan

rBir giriş anahtarının ne zaman tanımladığınız davranış .mp4 biçimi, Malvineous 'notu (bu sayfada) ve hata açıklaması 403 trac.ffmpeg.org/ticket/403 ; rçıktıda kullanıldığında açıklamanız yeniden kodlama sırasında olur, OP senaryosu ise .33 kare hızına sahip olmasıyla uyumlu bir durum (yeniden kodlama olmadan kare hızını düzelt) gibi görünür.
Tankçı

1
Raporu buraya yapıştırın . Üstteki komut satırını, giriş ve çıkış meta verilerini ve son olarak no. kare kodlanmış.
Gyan

1
OP'nin sadece dosyaya uymak istediğini, ancak kopya anahtar (lar) belirtilmediğinden verilen komutlarının yeniden kodlandığını kabul etti. Bu senaryoda, ffmpeg rfps'de yeni akış oluşturuyor olmalıdır .
Gyan

İkna edici örnek çıktı için Mulvya'ya teşekkür ederiz. Evet, kullanımı konusunda haklısınız -r. Bu kullanım, OP'ye yanıt olarak önceki deneylerimi etkileyemedi çünkü uygun bir vaka düşünerek, kopya parametresini ffmpeg'den asla düşürmedim ve -rbu nedenle yok sayıldı. Bir özellik isteği yazdım: trac.ffmpeg.org/ticket/5170
Tankman 六四

0

En hızlı yol, dizinde aşağıdaki satırlara sahip bir BAT dosyası oluşturmaktır:

@ECHO OFF

for %%f in (*.mp4) do (

echo “fullname: %%f”

del temp.mkv

mkvmerge --default-duration 0:18fps --fix-bitstream-timing-information 0 %%f -o temp.mkv

del %%f

ffmpeg -i temp.mkv -c:v copy %%f

del temp.mkv

)

Aynı dizinde mkvmerge ve ffmpeg olması gerekir. Kalite kaybı olmadan her mp4 dosyasını otomatik olarak saniyeler içinde değiştirir.

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.