จะลดขนาดตัวอย่าง 4k เป็น 1080p โดยใช้ ffmpeg ขณะที่รักษาคุณภาพได้อย่างไร


20

ฉันมีวิดีโอ 4K 3840x2160 บางรูปแบบในรูปแบบ MP4 ที่ฉันต้องนำมาลงให้ 1080p ฉันพยายามวิ่ง

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

แต่ผลลัพธ์นั้นมีคุณภาพไม่ดีมากโดยภาพทั้งหมดประกอบด้วยแผ่นสี่เหลี่ยม "ราวกับว่าฉันกำลังขยาย 4: 1"

นี่คือผลลัพธ์ของการรันคำสั่งนี้:

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%

ฉันรู้จากประสบการณ์ที่ ffmpeg เป็นเครื่องมือที่ยอดเยี่ยมดังนั้นฉันจะต้องขันตัวเลือก / พารามิเตอร์อย่างใด ...

ฉันจะทำสิ่งนี้ได้อย่างไร


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

@LordNeckbeard ฉันเพิ่งเพิ่มเอาต์พุตของคอนโซล ฉันต้องการลดระดับเพื่อให้ฉันสามารถแชร์คลิปเหล่านี้กับผู้ที่ทำงานกับฉันได้ง่ายขึ้น
lara michaels

1
อย่าลืม-c:a copyเนื่องจากคุณไม่ต้องการหรือจำเป็นต้องเข้ารหัสสตรีมเสียงอีกครั้ง ใช้-map 0เพื่อคัดลอกข้อมูลเมตาของบทหรือเนื้อหาอื่น ๆ (ffmpeg รับเพียง 1 vid + 1 aud ตามค่าเริ่มต้น)
Peter Cordes

1
นอกจากนี้-sws_flags lanczos+print_infoจะใช้ algo scaling ที่ดีกว่าค่าเริ่มต้น (bilinear ฉันคิดว่า) คำตอบของ stlb ครอบคลุมส่วนการเข้ารหัสวิดีโอของกระบวนการ
Peter Cordes

2
@PeterCordes scale=1920:-2:flags=lanczosอีกทางเลือกหนึ่ง ฉันกำลังจะพูดถึง-2สเกลในคำตอบที่ไม่มีอยู่ของฉัน สำหรับผู้ที่ไม่ทราบว่าคุณสามารถใส่-2ความกว้างหรือความสูงได้และจะให้ค่าที่ถูกต้องโดยอัตโนมัติในขณะที่รักษาอัตราส่วนภาพและทำให้ค่าหารด้วย 2 (ต้องการโดย libx264 สำหรับเอาต์พุต yuv420p)
llogan

คำตอบ:


17

การตั้งค่าเริ่มต้นสำหรับ ffmpeg นั้นมีคุณภาพต่ำมากและเนื่องจากคุณไม่ได้ระบุตัวแปลงสัญญาณหรือพารามิเตอร์คุณภาพมันเป็นเพียงแค่ใช้ค่าเริ่มต้น (ฉันไม่รู้ว่าทำไม devs ไม่แก้ไขเพราะสร้างคำถามมากมายในฟอรัม ทุกที่).

แก้ไข : ค่าเริ่มต้นตอนนี้ค่อนข้างมีสติ ด้วยการสร้าง ffmpeg เมื่อเร็ว ๆ นี้คุณไม่จำเป็นต้องระบุอะไรมากกว่าไฟล์อินพุตและไฟล์เอาท์พุตเพื่อให้ได้ผลลัพธ์ที่ดี แน่นอนคุณสามารถปรับแต่งตามความต้องการของหัวใจของคุณ

ลองเพิ่ม-c:v libx264 -crf 20 -preset slowคำสั่ง

  • -c:v libx264 บอกให้ใช้ตัวเข้ารหัส libx264
  • crf 20 ใช้ตัวคำนวณอัตราคงที่ (ซึ่งขัดแย้งกันหมายถึงอัตราบิตผันแปร แต่คุณภาพคงที่) ที่มีค่า 20 (คุณภาพที่ดีงาม; คุณภาพที่ดีกว่าคือไฟล์ที่ต่ำกว่า / ใหญ่กว่า, สูงกว่าคือ crappier / เล็กกว่า)
  • slowที่ตั้งไว้เป็นทางลัดสำหรับพวงของการตั้งค่าการเข้ารหัสที่หมายถึงจะทำให้ความพยายามมากขึ้นอีกนิดเป็นมันกว่าค่าเริ่มต้น (ขนาดกลาง) ที่

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

c:a copyและถ้าคุณกำลังใช้เสียงตามที่เป็นเพิ่ม ที่จะทำสำเนาตรงของกระแสเสียงโดยไม่ต้องเข้ารหัสใหม่


ค่าเริ่มต้นขึ้นอยู่กับโปรแกรมเปลี่ยนไฟล์ libx264 มักจะใช้สำหรับเอาต์พุต MP4 ตามค่าเริ่มต้นและสร้างเอาต์พุตคุณภาพดีโดยไม่มีตัวเลือกเพิ่มเติม แต่ ffmpeg บิลด์ในคำถามดูเหมือนจะไม่สนับสนุนตัวเข้ารหัสนี้ดังนั้นจึงใช้ตัวเข้ารหัสโบราณที่mpeg4สร้างวิดีโอ MPEG-4 ตอนที่ 2 และ ค่าเริ่มต้นสำหรับมันมีสติมากขึ้นในช่วงที่รุ่งเรือง (เช่นสำหรับ 320x240 เป็นต้น)
llogan

เป็นการดีที่ได้ยินว่า libx264 เป็นค่าเริ่มต้นในขณะนี้
stib

ผมว่า CRF 20 สวยยี้ดี 18 เป็นแบบสูญเสียหน้าที่ ฉันทำวิดีโอส่วนใหญ่เมื่อ 23.
user24601

งานส่วนใหญ่ของฉันแสดงบนอุปกรณ์เล่นที่ทำงานอยู่ในเครื่องจากการ์ด SD ฉันไม่ต้องการปรับขนาดให้เหมาะสมดังนั้นฉันจึงปล่อยให้มีคุณภาพสูงที่สุดเท่าที่จะทำได้ ฉันเห็นด้วยฉันจะกดมันลงถ้าฉันส่งผ่านเว็บ
stib

สิ่งนี้ไม่ได้ช่วยฉัน ฉันยังมีความแปลกประหลาดที่บล็อกไม่ว่าจะเกิดการเคลื่อนไหวในวิดีโอ crf ของ 18 ตั้งไว้ล่วงหน้าให้ช้า 2.7k-> 1080p
rewolf

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.