การแปลงวิดีโอจาก 1080p เป็น 720p ด้วยการสูญเสียคุณภาพที่น้อยที่สุดโดยใช้ ffmpeg


45

ฉันซ้อนด้วยภาพยนตร์คุณภาพสูงของฉัน: 1080p ที่มี 60fps ปัญหาคือล่าช้าในขณะที่เล่น

ฉันพยายามแปลงเป็น 720p ด้วย ffmpeg:

ffmpeg -i MyMovie.mkv -r 60 -s hd720 MyMovie_720p.mkv

แต่ฉันมีการสูญเสียคุณภาพอย่างมีนัยสำคัญเพราะอัตราบิตลดลงจาก 32.3 Mbps เป็น 2.8 Mbps ฉันจะระบุอัตราบิตที่ถูกต้องสำหรับสตรีมวิดีโอได้อย่างไรและปล่อยให้สตรีมอื่นคัดลอกล้วนๆ

อินพุตไฟล์ mediainfo:

ID                                       : 1
Format                                   : AVC
Format/Info                              : Advanced Video Codec
Format profile                           : High@L4.2
Format settings, CABAC                   : Yes
Format settings, ReFrames                : 4 frames
Codec ID                                 : V_MPEG4/ISO/AVC
Duration                                 : 2h 58mn
Bit rate                                 : 32.3 Mbps
Width                                    : 1 920 pixels
Height                                   : 1 080 pixels
Display aspect ratio                     : 16:9
Frame rate                               : 59.940 fps
Color space                              : YUV
Chroma subsampling                       : 4:2:0
Bit depth                                : 8 bits
Scan type                                : Progressive
Bits/(Pixel*Frame)                       : 0.260
Stream size                              : 40.2 GiB (92%)
Writing library                          : x264 core 116 r2019 9cc407d
Encoding settings                        : cabac=1 / ref=4 / deblock=1:-2:-1 / analyse=0x3:0x113 / me=umh / subme=10 / psy=1 / psy_rd=0.80:0.20 / mixed_ref=1 / me_range=32 / chroma_me=1 / trellis=2 / 8x8dct=1 / cqm=0 / deadzone=21,11 / fast_pskip=0 / chroma_qp_offset=-3 / threads=6 / sliced_threads=0 / nr=0 / decimate=0 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=6 / b_pyramid=2 / b_adapt=2 / b_bias=0 / direct=3 / weightb=1 / open_gop=0 / weightp=2 / keyint=250 / keyint_min=25 / scenecut=40 / intra_refresh=0 / rc_lookahead=60 / rc=crf / mbtree=0 / crf=14.0 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / vbv_maxrate=50000 / vbv_bufsize=62500 / crf_max=0.0 / nal_hrd=none / ip_ratio=1.40 / pb_ratio=1.30 / aq=1:0.60
Language                                 : English
Default                                  : Yes
Forced                                   : No
Matrix coefficients 

                 : BT.709-5, BT.1361, IEC 61966-2-4 709, SMPTE RP177

คำตอบ:


93

นี่คือตัวอย่างที่ควรให้วิดีโอคุณภาพสูงสุดแก่คุณ (ฉันไม่ได้พูดถึงขนาดไฟล์ที่ได้) โปรดทราบว่าวิดีโอนี้อาจไม่สามารถเล่นได้ในทุกอุปกรณ์หรือผู้เล่น:

ffmpeg -i MyMovie.mkv -vf scale=-1:720 -c:v libx264 -crf 0 -preset veryslow -c:a copy MyMovie_720p.mkv

ในการรับคุณภาพ "สูญเสียสายตา" คุณสามารถใช้:

ffmpeg -i MyMovie.mkv -vf scale=-1:720 -c:v libx264 -crf 18 -preset veryslow -c:a copy MyMovie_720p.mkv

ตอนนี้เรามาดูสิ่งที่เรามีที่นี่:

กรองวิดีโอขนาดสำหรับการปรับขนาดวิดีโอ คุณเพิ่งตั้งขนาดหนึ่ง - ซึ่งเป็นความสูงในตัวอย่างนี้ - และใช้-1สำหรับมิติอื่น ffmpeg จะคำนวณค่าที่ถูกต้องใหม่โดยอัตโนมัติในขณะที่คงอัตราส่วนไว้

ควบคุมคุณภาพด้วย-crfตัวเลือก:

ช่วงของขนาดควอไลเซอร์คือ 0-51: โดยที่ 0 คือ lossless, 23 เป็นค่าเริ่มต้นและ 51 เป็นไปได้ที่เลวร้ายที่สุด ค่าที่ต่ำกว่าคือคุณภาพที่สูงกว่าและช่วงที่มีเหตุผลคือ 18-28 พิจารณาที่ 18 ว่าจะสูญเสียการมองเห็นหรือเกือบจะเป็นเช่นนั้น: มันควรมีลักษณะเหมือนหรือเกือบเหมือนกับอินพุต แต่ก็ไม่สูญเสียทางเทคนิค

ช่วงเป็นเลขชี้กำลังดังนั้นการเพิ่มค่า CRF +6 จะเท่ากับบิตเรตครึ่งหนึ่งในขณะที่ -6 จะเป็นบิตเรตเป็นสองเท่า การใช้งานทั่วไปคือการเลือกค่า CRF สูงสุดที่ยังคงคุณภาพที่ยอมรับได้ หากผลลัพธ์ดูดีให้ลองใช้ค่าที่สูงขึ้นและหากดูไม่ดีให้เลือกค่าที่ต่ำกว่า

คุณสามารถค้นหาข้อมูลเพิ่มเติมในคู่มือการเข้ารหัส x264

คุณสามารถควบคุมการแลกเปลี่ยนระหว่างความเร็วการเข้ารหัสวิดีโอและประสิทธิภาพการบีบอัดด้วย-presetตัวเลือก เหล่านี้คือเร็วมาก, รวดเร็ว, veryfast, เร็วกว่า, เร็ว, กลาง, ช้าช้า veryslow เริ่มต้นเป็นขนาดกลาง veryslowตัวเลือกข้อเสนอประสิทธิภาพการบีบอัดที่ดีที่สุด (ส่งผลให้ขนาดไฟล์เล็กให้มีคุณภาพเหมือนกัน) แต่มันจะช้ามาก - เป็นชื่อที่กล่าวว่า

เสียงจะถูกคัดลอกโดยตรงจากไฟล์อินพุตไปยังไฟล์เอาต์พุตโดยไม่มีการเปลี่ยนแปลงใด ๆ


2
LordNeckbeard - ขอบคุณสำหรับการแก้ไข ฉันไม่มีเวลาพอที่จะพิมพ์รายละเอียดทั้งหมด
Nikola Dimitrijevic

1
ตัวอย่างคุณกำลังตั้งค่าความสูงเป็น 720 ไม่ใช่ความกว้าง
chovy

คุณสามารถทำวิดีโอย้อนหลังนี้ได้ไหม.stackexchange.com/questions/20439/…
วิลเลียม

2
การคัดลอกคำบรรยายใน MKV -scodec copyโดยไม่ต้องแปลงคุณสามารถเพิ่ม
Casper

2
ผมคิดว่าจะได้รับ 720p คุณต้องตั้งค่าความกว้าง 1280 คือไม่ แต่-vf scale=-1:720 -vf scale=1280:-1
cdlvcdlv

0

ในกรณีที่คุณต้องการปรับขนาดในขนาดที่แตกต่างกันมีข้อ จำกัด บางประการเกี่ยวกับขนาดการปรับขนาด FFMPEG ไม่ยอมรับความสูงแต่ละรายการนี่คือรายการคำแนะนำที่ดีที่สุดสำหรับส่วนข้อมูลขนาดเล็ก

ตัวแปลงสัญญาณวิดีโอทำงานได้ดีขึ้นเมื่อความกว้างและความสูงเป็นพิกเซลทวีคูณที่ 16 ในขณะที่คุณสามารถใช้ความกว้างและความสูงใด ๆ ในการตั้งค่าการเข้ารหัสขนาดที่ไม่เหมาะสมอาจส่งผลให้คุณภาพของภาพต่ำลงและอัตราเฟรมลดลง เพื่อคุณภาพของภาพและการเล่นที่ดีที่สุดคุณควรใช้ขนาดความกว้างและความสูงสำหรับวิดีโอของคุณที่มีทวีคูณเป็น 16 ตัวเลือกที่ดีที่สุดของคุณต่อไปคือทวีคูณของ 8 และหลังจากนั้นคูณด้วย 4

Recommended width and height for videos with 16:9 aspect ratios:

Best Choice:     2nd Best:        3rd Best:
Multiples of 16  Multiples of 8   Multiples of 4
1920 x 1080      1792 x 1008      1856 x 1044
1280 x 720       1152 x 648       1216 x 684
1024 x 576        896 x 504       1088 x 612
 768 x 432        640 x 360        960 x 540
 512 x 288        384 x 216        832 x 468
 256 x 144        128 x 72         704 x 396
                                   576 x 324
                                   448 x 252
                                   320 x 180
                                   192 x 108
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.