Kaliteyi korurken ffmpeg kullanarak 4k'den 1080p'ye nasıl örnek alınır?


21

1080p'ye getirmem gereken MP4 formatında bazı 4K 3840x2160 çekimlerim var. Koşmayı denedim

ffmpeg -i orig.mp4 -vf scale=1920:1080 smaller.mp4  

ancak sonuç çok düşük kalitedir, tüm görüntü 4: 1 büyütüyormuş gibi kare "döşemelerden" oluşur.

Bu komutu çalıştırmanın çıktısı:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'origs/P1000003.MP4':
  Metadata:
    major_brand     : mp42
    minor_version   : 1
    compatible_brands: mp42avc1
    creation_time   : 2015-02-19 17:10:38
  Duration: 00:05:14.48, start: 0.000000, bitrate: 95903 kb/s
    Stream #0.0(und): Video: h264 (High), yuvj420p, 3840x2160 [PAR 1:1 DAR 16:9], 95792 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc
    Metadata:
      creation_time   : 2015-02-19 17:10:38
    Stream #0.1(und): Audio: aac, 48000 Hz, stereo, s16, 125 kb/s
    Metadata:
      creation_time   : 2015-02-19 17:10:38
Incompatible pixel format 'yuvj420p' for codec 'mpeg4', auto-selecting format 'yuv420p'
[buffer @ 0x22a3420] w:3840 h:2160 pixfmt:yuvj420p
[scale @ 0x22a3ce0] w:3840 h:2160 fmt:yuvj420p -> w:1920 h:1080 fmt:yuv420p flags:0x4
Output #0, mp4, to '1-short.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 1
    compatible_brands: mp42avc1
    creation_time   : 2015-02-19 17:10:38
    encoder         : Lavf53.21.1
    Stream #0.0(und): Video: mpeg4, yuv420p, 1920x1080 [PAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 25 tbn, 25 tbc
    Metadata:
      creation_time   : 2015-02-19 17:10:38
    Stream #0.1(und): Audio: libvo_aacenc, 48000 Hz, stereo, s16, 200 kb/s
    Metadata:
      creation_time   : 2015-02-19 17:10:38
Stream mapping:
  Stream #0.0 -> #0.0
  Stream #0.1 -> #0.1
Press ctrl-c to stop encoding
frame=  125 fps=  6 q=31.0 Lsize=     968kB time=5.00 bitrate=1586.7kbits/s    
video:842kB audio:123kB global headers:0kB muxing overhead 0.421047%

Deneyimden ffmpeg mükemmel bir araç olduğunu biliyorum, bu yüzden bir şekilde seçenekleri / parametreleri berbat olmalı ...

Bunu nasıl yapabilirim?


Lütfen komutunuzdan tam, eksiksiz konsol çıktısını gösterin. Sadece kısa bir segmenti kodlayabilirsiniz, bu nedenle -t 1010 saniyelik bir çıkış yapmak için ekleyin . Neden küçülmek istiyorsun? Ölçekli çıktınız için kullanım durumu nedir? Bu bilgi daha doğru bir cevap vermeme yardımcı olacak.
llogan

@ LordNeckbeard Konsol çıkışını yeni ekledim. Bu klipleri benimle çalışan insanlarla daha kolay paylaşabilmem için küçültmek istiyorum.
lara michaels

1
-c:a copySes akışını yeniden kodlamak istemediğiniz veya ihtiyaç duymadığınız için unutmayın . -map 0Bölüm meta verilerini veya diğer şeyleri kopyalamak için kullanın . (ffmpeg varsayılan olarak yalnızca 1 vid + 1 aud alır.)
Peter Cordes

1
Ayrıca, -sws_flags lanczos+print_infovarsayılandan daha iyi bir ölçekleme algo kullanacaktır (bilinear sanırım). stlb'nin cevabı, sürecin video kodlama kısmını kapsar.
Peter Cordes

2
@PeterCordes Alternatif olarak scale=1920:-2:flags=lanczos,. -2Varolmayan cevabımdaki for ölçeğinden de bahsedecektim . Bilmeyenler için -2, genişlik veya yükseklik koyabilirsiniz ve en boy oranını korurken ve değeri 2'ye bölünebilir hale getirirken otomatik olarak doğru değeri sağlayacaktır (yuv420p çıkışları için libx264 için gereklidir).
llogan

Yanıtlar:


17

Ffmpeg için varsayılan ayarlar çok düşük kalitededir ve herhangi bir kodek veya kalite parametresi belirtmediğiniz için sadece varsayılanları kullanmaktadır (Forumlarda çok fazla soru oluşturduğu için neden geliştiricilerin bunu düzeltmediğini bilmiyorum her yerde).

Düzenleme : varsayılanlar şimdi oldukça aklı başında. Yeni bir ffmpeg derlemesiyle, iyi kullanılabilir sonuçlar elde etmek için giriş ve çıkış dosyalarından başka bir şey belirtmeniz gerekmez. Elbette kalbinizin arzusuna ince ayar yapabilirsiniz.

-c:v libx264 -crf 20 -preset slowKomuta eklemeyi deneyin .

  • -c:v libx264 libx264 kodlayıcıyı kullanmasını söyler,
  • crf 20 Sabit Değer Faktörü nicelleştiricisini (paradoksal olarak değişken bit hızı, ancak sabit kalite anlamına gelir) 20 değeriyle (oldukça iyi kalite; daha düşük daha iyi kalite / daha büyük dosyalar, daha yüksek daha kısa / daha küçüktür) kullanır,
  • slowÖnceden ayarlanmış varsayılan (orta) daha içine biraz daha çaba koyar aracının kodlayıcı ayarlarında bir grup için bir kısa yoldur.

Bu ayarları değiştirebilir, hangi düğmelerin döndürüleceğine ilişkin talimatlar için h.264 kodlama kılavuzuna bakın.

Ve sesi olduğu gibi kullanıyorsanız ekleyin c:a copy. Bu, yeniden kodlamadan ses akışının düz bir kopyasını yapar.


Varsayılan değerler kodlayıcıya bağlıdır. libx264 genellikle varsayılan olarak MP4 çıkışı için kullanılır ve ek seçenek olmadan güzel bir kalite çıkışı üretir, ancak söz konusu ffmpeg derlemesi bu kodlayıcıyı desteklemiyor gibi görünür ve bu nedenle mpeg4MPEG-4 Bölüm 2 video üreten eski kodlayıcıyı kullanır ve onun varsayılanları en parlak döneminde daha aklı başındaydı (örneğin 320x240, vb.).
llogan

Libx264'ün artık varsayılan olduğunu duymak güzel.
stib

Ben crf 20 güzel olduğunu söyleyebilirim lanetlemek iyi. 18 işlevsel olarak kayıpsızdır. Videolarımın çoğunu 23'te
yapıyorum

İşlerimin çoğu, bir SD karttan yerel olarak çalışan oynatma cihazlarında görüntüleniyor. Boyut için fazla optimize etmeme gerek yok, bu yüzden kaliteyi olabildiğince yüksek bırakıyorum. Katılıyorum, web üzerinden teslim olsaydım çeviririm.
Eylül'de stib

Bu bana yardımcı olmadı. Videoda hareketin olduğu her yerde hala garip bir garipliğim var. crf 18, önceden ayarlanmış yavaş. 2.7k-> 1080p.
rewolf

0

İsterseniz avconv kullanın :

avconv -i 4kfile.mp4 -s hd1080 -c:v libx264 -c:a copy fullhdfile.mp4
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.