Bagaimana cara downsample 4k ke 1080p menggunakan ffmpeg dengan tetap menjaga kualitas?

20

Saya memiliki beberapa rekaman 4K 3840x2160 dalam format MP4 yang harus saya bawa ke 1080p. Saya mencoba berlari

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

tetapi hasilnya adalah kualitas yang sangat buruk, dengan seluruh gambar yang terdiri dari "kotak" persegi seolah-olah saya memperbesar 4: 1.

Ini adalah output dari menjalankan perintah ini:

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%

Saya tahu dari pengalaman bahwa ffmpeg adalah alat yang sangat baik, jadi saya harus mengacaukan opsi / parameter entah bagaimana ...

Bagaimana saya bisa melakukan ini?

lara michaels
sumber
Tolong tunjukkan output konsol lengkap dan lengkap dari perintah Anda. Anda bisa menyandikan segmen pendek, jadi tambahkan -t 10untuk menghasilkan 10 detik. Mengapa Anda ingin turun? Apa gunanya kasing untuk keluaran berskala Anda? Info ini akan membantu saya memberikan jawaban yang lebih akurat.
llogan
@ LordNeckbeard Saya baru saja menambahkan output konsol. Saya ingin menurunkan skala sehingga saya dapat lebih mudah berbagi klip ini dengan orang-orang yang bekerja dengan saya.
lara michaels
1
Jangan lupa -c:a copy, karena Anda tidak ingin atau perlu menyandikan ulang aliran audio. Gunakan -map 0untuk menyalin metadata bab apa pun, atau hal-hal lain. (ffmpeg hanya membutuhkan 1 vid + 1 aud secara default.)
Peter Cordes
1
Juga, -sws_flags lanczos+print_infoakan menggunakan algo scaling yang lebih baik daripada default (menurut saya bilinear). jawaban stlb mencakup bagian penyandian video dari proses.
Peter Cordes
2
@PeterCordes Atau scale=1920:-2:flags=lanczos,. Saya juga akan menyebutkan -2skala untuk jawaban saya yang tidak ada. Bagi mereka yang tidak tahu Anda dapat memasukkan -2lebar atau tinggi, dan itu akan secara otomatis memberikan nilai yang benar sambil mempertahankan rasio aspek dan membuat nilai dapat dibagi 2 (diperlukan oleh libx264 untuk output yuv420p).
Logan

Jawaban:

17

Pengaturan default untuk ffmpeg berkualitas sangat rendah, dan karena Anda tidak menentukan codec atau parameter kualitas apa pun, itu hanya menggunakan default (Saya tidak tahu mengapa devs tidak memperbaikinya karena menghasilkan banyak pertanyaan di forum dimana mana).

Sunting : standarnya sekarang cukup waras. Dengan ffmpeg terbaru, Anda tidak perlu menentukan apa pun selain file input dan output untuk mencapai hasil yang bisa digunakan. Anda tentu saja dapat menyesuaikan keinginan hati Anda.

Coba tambahkan -c:v libx264 -crf 20 -preset slowke perintah.

  • -c:v libx264 memintanya untuk menggunakan libx264 encoder,
  • crf 20 menggunakan quantiser Faktor Tingkat Konstan (yang secara paradoksal berarti laju bit variabel, tetapi kualitas konstan) dengan nilai 20 (kualitas cukup bagus; lebih rendah kualitas lebih baik / file lebih besar, lebih tinggi crappier / lebih kecil),
  • yang slowditetapkan adalah cara pintas untuk sekelompok pengaturan encoder yang berarti menempatkan usaha sedikit lebih ke dalamnya dari default (media).

Anda dapat mengubah pengaturan ini, lihat panduan pengkodean h.264 untuk instruksi tentang kenop yang ingin diputar.

Dan jika Anda menggunakan audio apa adanya, tambahkan c:a copy. Itu akan melakukan salinan langsung dari aliran audio tanpa pengodean ulang.

stib
sumber
Standarnya tergantung pada enkoder. libx264 biasanya digunakan untuk keluaran MP4 secara default, dan ia menghasilkan keluaran berkualitas bagus tanpa opsi tambahan, tetapi build ffmpeg dalam pertanyaan tersebut tampaknya tidak mendukung encoder ini dan karenanya menggunakan encoder kuno yang mpeg4menghasilkan video MPEG-4 Bagian 2, dan default untuk itu lebih waras selama masa jayanya (seperti untuk 320x240, dll).
Logan
Senang mendengar bahwa libx264 adalah default sekarang.
stib
Saya akan mengatakan crf 20 sangat bagus. 18 secara fungsional tidak rugi. Saya melakukan sebagian besar video saya di 23.
user24601
Sebagian besar pekerjaan saya ditampilkan pada perangkat pemutaran yang bekerja secara lokal dari kartu SD. Saya tidak perlu mengoptimalkan banyak untuk ukuran, jadi saya meninggalkan kualitas setinggi yang saya bisa. Saya setuju, saya akan mematikannya jika mengirim melalui web.
stib
Ini tidak membantu saya. Saya masih memiliki keanehan kuning di mana pun gerakan terjadi dalam video. crf dari 18, diatur ke lambat. 2.7k-> 1080p.
rewolf
0

Gunakan avconv jika Anda mau:

avconv -i 4kfile.mp4 -s hd1080 -c:v libx264 -c:a copy fullhdfile.mp4
Guray Celik
sumber