Yeniden kodlama yapmadan ffmpeg'deki kare hızını değiştir


14

23.976 fps (24000/1001) olan bir mkv (h264) videom var ama yeniden kodlama ve kalite kaybı olmadan 25 fps'ye dönüştürmek istiyorum. Mkvmerge bunu yapabilir biliyorum (isteğe bağlı - varsayılan-süresi '0: 25fps') ama mümkünse doğrudan ffmpeg'den yapmak istiyorum Dokümanlara göre bu çalışması gerekir:

ffmpeg -i input.mkv -r 25 -vcodec copy output.mkv

ama ben yürüttüğümde sadece aynı video fps olsun. Ffmpeg'de (varsa) bunu yapmak için doğru yöntem nedir?


1
Bunun şu anda FFmpeg ile mümkün olmadığına inanıyorum. -rakış kopyasıyla uyumlu değil ve kare hızını değiştirmek için bit akışı filtreleri yok.
Ely

1
çok kötü. Her seferinde mkvmerge kullanmam gerekecek. teşekkürler
phate89

1
Bunu düzenli ffmpeg ile yapmanın karmaşık bir yolu ve bunu eski modifiye bir ffmpeg sürümü ile yapmanın doğrudan bir yolu var. Eğer ilgileniyorsanız, cevap olarak yazacağım.
Gyan

1
Evet teşekkürler .. Ekstra araçlar olmadan yapmak istiyorum (zaten
ffmpeg'e

1
@Mulvya bunun hakkında mı konuşuyorsun ? Bağlamak için tereddüt ettim, ama şimdi eski .. Ama düzenli FFmpeg ile yapmak için kıvrık bir şekilde ilgileniyor.
Ely

Yanıtlar:


15

İşte FFmpeg'in güncel sürümlerini kullanan yöntem. Concat demuxer'ın ilk dosyadan sonra girişlerin PTS'sini yeniden ölçeklememesine değil, sadece sabit bir ofset uygulamasına dayanır. Diyelim ki bir zaman ölçeği olan 15360(fFmpeg çıkışına özgü) 30 fps akışınız var . Bu demektir ki çerçeve 0PTS sahiptir 0ve çerçeve 30PTS sahiptir 15360. 23040PTS değerlerini etkilemeden zaman ölçeğini değiştirebilirsek, bu 45 fps akışı olur .

Esasen, aşağıdaki yöntem budur.

1 . Kaynak özelliklerini tanımlayın.

Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1171 kb/s,
       30 fps, 30 tbr, 15360 tbn (default)

Kaynak özelliklerini, özellikle de çözünürlüğü ve tbn.


2a . (İsteğe bağlı) Hesaplamaları daha basit hale getirmek için zaman ölçeğini uygun bir şeye değiştirin.

ffmpeg -i in.mp4 -c copy -an -video_track_timescale 30 in-v30.mp4

Bu bizi

Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1171 kb/s, \
       30 fps, 30 tbr, 30 tbn (default

Bu adımı uygularsanız, yeni zaman ölçeği orijinal kare hızının eşit veya katları olmalıdır.

2b . Hedef zaman xaralığı xiçin kaynaktaki # karesinin PTS'sinin yenisiyle aynı değere sahip olması için gereken zaman ölçeğini hesaplayın tbn. Adım 2a'yı gerçekleştirdiyseniz, bu çok kolaydır ve sadece yeni kare hızıdır. Yani, hedef fps için 45yeni tbnolmalı 45.


3 . Sahte video oluşturun.

ffmpeg -f lavfi -i color=s=1280x720:r=45:d=1 -profile:v main -video_track_timescale 45 0.mp4

En iyi sonuçlar için tüm özellikler çözünürlük, H.264 profili, piksel biçimi, refs sayısı vb. İle aynı olmalıdır.


4 Videolara eşlik edin.

Önce bir metin dosyası oluşturun

file '0.mp4'
file 'in-v30.mp4'

Sonra concat

ffmpeg -f concat -i list.txt -c copy -video_track_timescale 45 45fps.mp4

Çıktı dosyasında 45 fps hızında oynatılan 2. video olacaktır.

5 . Şimdi, kukla önyargıyı böl

ffmpeg -ss 1.1 -i 45fps.mp4 -c copy -avoid_negative_ts make_zero in45.mp4

ve sen sahipsin

Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1757 kb/s, \
       45 fps, 45 tbr, 11520 tbn (default)

Bunun kıvrık olduğunu söylemiştim!


1
çok zeki, iyi cevap.
Rowe Morehouse
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.