สรุปสั้นๆ (TL;DR)
FFmpeg อัปสเกลวิดีโอด้วย -vf "scale=1920:1080:flags=lanczos" — Lanczos เป็นอัลกอริทึมการปรับขนาดที่ดีที่สุดสำหรับการอัปสเกล สำหรับการลดสัญญาณรบกวน (denoising) hqdn3d ช่วยลดเกรนในขณะที่ยังคงรักษารายละเอียดขอบไว้ สำหรับการทำให้ภาพนิ่ง (stabilization) vidstab จัดการกับการสั่นของกล้องผ่านกระบวนการสองขั้นตอน สามารถรวมทั้งสามเข้าด้วยกันในชุดฟิลเตอร์เดียวสำหรับกระบวนการเพิ่มคุณภาพ
บทนำ
การเพิ่มคุณภาพวิดีโอด้วย FFmpeg เป็นมากกว่าการเปลี่ยนความละเอียด การปรับปรุงคุณภาพอย่างแท้จริงคือการรวมการอัปสเกลความละเอียดเข้ากับการลดสัญญาณรบกวนอย่างชาญฉลาด และการทำให้ภาพนิ่ง (ถ้ามี) แต่ละขั้นตอนจะแก้ไขปัญหาคุณภาพที่แตกต่างกัน: ฟุตเทจที่เบลอหรือเป็นพิกเซล, เฟรมที่เป็นเกรนหรือมีสัญญาณรบกวน และการเคลื่อนไหวของกล้องที่สั่นไหว
คู่มือนี้จะครอบคลุมแต่ละเทคนิคอย่างอิสระและแสดงวิธีการรวมเข้าด้วยกัน
อัลกอริทึมการปรับขนาด (Scaling algorithms)
อัลกอริทึมการปรับขนาดเป็นตัวกำหนดว่า FFmpeg จะเติมพิกเซลใหม่เมื่อทำการอัปสเกลอย่างไร การเลือกอัลกอริทึมมีผลกระทบที่เห็นได้ชัดต่อคุณภาพของผลลัพธ์
| อัลกอริทึม | ความเร็ว | คุณภาพ | ดีที่สุดสำหรับ |
|---|---|---|---|
neighbor |
เร็วที่สุด | ต่ำที่สุด | ภาพพิกเซลอาร์ต |
bilinear |
เร็ว | ต่ำ | งานที่เน้นความเร็วเป็นหลัก |
bicubic |
ปานกลาง | ดี | การดาวน์สเกลทั่วไป |
lanczos |
ช้ากว่า | ดีที่สุด | การอัปสเกล |
อัปสเกลเป็น 1080p ด้วย Lanczos:
ffmpeg -i input_720p.mp4 -vf "scale=1920:1080:flags=lanczos" -c:v libx264 -crf 20 output_1080p.mp4
รักษาสัดส่วนภาพ:
ffmpeg -i input.mp4 -vf "scale=1920:-2:flags=lanczos" -c:v libx264 -crf 20 output.mp4
-2 จะคำนวณความสูงโดยอัตโนมัติในขณะที่รักษาสัดส่วนภาพ และทำให้แน่ใจว่าผลลัพธ์นั้นหารด้วย 2 ลงตัว
ปรับขนาดเป็น 4K:
ffmpeg -i input.mp4 -vf "scale=3840:-2:flags=lanczos" -c:v libx264 -crf 18 -preset slow output_4k.mp4
-preset slow บอก x264 ให้ใช้เวลามากขึ้นในการปรับปรุงการบีบอัด ซึ่งสำคัญกว่าสำหรับความละเอียดที่สูงขึ้น
การลดสัญญาณรบกวนด้วย hqdn3d (Denoising with hqdn3d)
ฟิลเตอร์ hqdn3d คือการลดสัญญาณรบกวน 3D คุณภาพสูง ช่วยขจัดเกรนและสัญญาณรบกวนในขณะที่ยังคงรักษารายละเอียดขอบไว้
ffmpeg -i noisy_video.mp4 -vf "hqdn3d=4:3:6:4.5" -c:v libx264 -crf 20 denoised.mp4
พารามิเตอร์ทั้งสี่: luma_spatial:chroma_spatial:luma_temporal:chroma_temporal
luma_spatial(0-16): สัญญาณรบกวนเชิงพื้นที่ในช่องความสว่าง ค่าเริ่มต้น 4chroma_spatial(0-16): สัญญาณรบกวนเชิงพื้นที่ในช่องสี ค่าเริ่มต้น 3luma_temporal(0-16): การปรับเรียบตามเวลาในช่องความสว่าง ค่าเริ่มต้น 6chroma_temporal(0-16): การปรับเรียบตามเวลาในช่องสี ค่าเริ่มต้น 4.5
การลดสัญญาณรบกวนที่แรงขึ้น:
ffmpeg -i grainy.mp4 -vf "hqdn3d=10:8:15:10" -c:v libx264 -crf 20 clean.mp4
ค่าที่สูงขึ้นจะกำจัดสัญญาณรบกวนได้มากขึ้น แต่อาจทำให้รายละเอียดที่ละเอียดเบลอได้ ทดสอบด้วยการตั้งค่าที่แตกต่างกันก่อนประมวลผลวิดีโอฉบับเต็ม
การลดสัญญาณรบกวนแบบเบา (คงรายละเอียด):
ffmpeg -i video.mp4 -vf "hqdn3d=2:1.5:3:2.5" -c:v libx264 -crf 20 output.mp4
การทำให้ภาพนิ่งด้วย vidstab (Stabilization with vidstab)
ฟิลเตอร์ vidstab ต้องใช้วิธีการสองขั้นตอน: ขั้นแรกวิเคราะห์การเคลื่อนไหว จากนั้นจึงใช้การทำให้ภาพนิ่ง
การติดตั้ง: การสนับสนุน vidstab ขึ้นอยู่กับการสร้าง FFmpeg ของคุณ ตรวจสอบด้วย ffmpeg -filters | grep vidstab บน macOS: brew install ffmpeg จะรวมอยู่ด้วย
ขั้นตอนที่ 1: วิเคราะห์การเคลื่อนไหว
ffmpeg -i shaky_video.mp4 -vf "vidstabdetect=stepsize=6:shakiness=8:accuracy=9:result=transform.trf" -f null -
shakiness=8 (1-10): ระดับการสั่นของกล้องที่คาดหวัง accuracy=9 (1-15): ความแม่นยำในการตรวจจับ -f null - ทิ้งผลลัพธ์ เราต้องการเพียงไฟล์ .trf
ขั้นตอนที่ 2: ใช้การทำให้ภาพนิ่ง
ffmpeg -i shaky_video.mp4 -vf "vidstabtransform=input=transform.trf:zoom=1:smoothing=10" -c:v libx264 -crf 20 stabilized.mp4
zoom=1 เพิ่มการซูม 1% เพื่อชดเชยการตัดขอบที่เกิดจากการทำให้ภาพนิ่ง เพิ่มค่าถ้ามีขอบสีดำปรากฏขึ้น smoothing=10 ควบคุมความเรียบของเส้นทางกล้อง (ค่าสูงขึ้น = เรียบขึ้น)
การทำให้ภาพนิ่งที่รุนแรงขึ้น:
ffmpeg -i video.mp4 -vf "vidstabtransform=input=transform.trf:zoom=3:smoothing=30:optzoom=1" -c:v libx264 -crf 20 stable.mp4
optzoom=1 จะปรับการซูมโดยอัตโนมัติเพื่อหลีกเลี่ยงขอบ
การรวมกระบวนการเพิ่มคุณภาพ (Combined quality enhancement pipeline)
เรียกใช้การดำเนินการทั้งสามพร้อมกันในชุดฟิลเตอร์เดียว:
ffmpeg -i source.mp4 \
-vf "hqdn3d=4:3:6:4.5,scale=1920:-2:flags=lanczos,vidstabtransform=input=transform.trf:zoom=1:smoothing=10" \
-c:v libx264 -crf 18 -preset slow \
-c:a copy \
enhanced.mp4
ใช้ลำดับนี้: ลดสัญญาณรบกวนก่อน (กำจัดสิ่งประดิษฐ์ที่อาจส่งผลต่อการปรับขนาด) จากนั้นปรับขนาด แล้วทำให้ภาพนิ่ง วิธีนี้จะหลีกเลี่ยงการปรับขนาดสัญญาณรบกวนให้มีความละเอียดสูงขึ้น
หมายเหตุ: รันขั้นตอน vidstabdetect ก่อนที่จะใช้กระบวนการรวมนี้
ฟิลเตอร์ปรับความคมชัด (Sharpening filter)
หากฟุตเทจดูนุ่มนวลมากกว่าเป็นสัญญาณรบกวน การปรับความคมชัดสามารถช่วยได้:
ffmpeg -i video.mp4 -vf "unsharp=5:5:1.5:5:5:0.5" -c:v libx264 -crf 20 sharpened.mp4
พารามิเตอร์: lx:ly:la:cx:cy:ca (ขนาดและปริมาณของ luma/chroma)lx:ly — ขนาดเมทริกซ์ luma (พิกเซล)la — ปริมาณ luma (ค่าบวก = เพิ่มความคมชัด, ค่าลบ = เบลอ)cx:cy:ca — ค่าเทียบเท่าของ chroma
สำหรับการปรับความคมชัดแบบเบา: unsharp=3:3:0.5:3:3:0.0
สำหรับการปรับความคมชัดแบบแรง: unsharp=5:5:2.5:5:5:0.0
ข้อควรพิจารณาด้านประสิทธิภาพ (Performance considerations)
การดำเนินการปรับปรุงคุณภาพต้องใช้การประมวลผลสูง ประมาณการเวลาประมวลผลสำหรับวิดีโอ 1080p ความยาว 10 นาที:
- การปรับขนาดอย่างเดียว: 2-5 นาที
- ปรับขนาด + hqdn3d: 5-10 นาที
- ปรับขนาด + hqdn3d + vidstab: 15-25 นาที
ใช้ -preset เพื่อปรับสมดุลระหว่างความเร็วในการเข้ารหัสกับขนาดไฟล์:
ultrafast— เข้ารหัสเร็วที่สุด, ขนาดไฟล์ใหญ่ขึ้นfast— ความเร็ว/ขนาดปานกลางslow— ช้าที่สุด, ไฟล์มีขนาดเล็กที่สุดสำหรับ CRF ที่กำหนดveryslow— โดยปกติไม่คุ้มกับเวลาที่เพิ่มขึ้นเมื่อเทียบกับslow
สำหรับการประมวลผลแบบแบตช์ ให้รันหลายไฟล์พร้อมกันหรือใช้ parallel:
ls *.mp4 | parallel ffmpeg -i {} -vf "scale=1920:-2:flags=lanczos" -c:v libx264 -crf 20 enhanced_{/}
การเชื่อมต่อกับ API การอัปสเกลวิดีโอด้วย AI
สำหรับการอัปสเกลด้วย AI (ซึ่งให้ผลลัพธ์ที่ดีกว่าฟิลเตอร์ของ FFmpeg สำหรับฟุตเทจคุณภาพต่ำหรือเสียหาย) มี API เฉพาะอยู่ควบคู่ไปกับเครื่องมือของ FFmpeg
WaveSpeedAI นำเสนอโมเดลการอัปสเกล AI ที่ใช้ neural upscaling แทนฟิลเตอร์อัลกอริทึม:
POST https://api.wavespeed.ai/api/v2/wavespeed-ai/video-enhance
Authorization: Bearer {{WAVESPEED_API_KEY}}
Content-Type: application/json
{
"video_url": "https://storage.example.com/source-video.mp4",
"scale": 2,
"enhance": true
}
ทดสอบสิ่งนี้ด้วย Apidog ก่อนการรวมระบบ:
เพิ่มการยืนยัน:
Status code is 200
Response body has field id
สอบถามสถานะของ endpoint เพื่อดูความสมบูรณ์ จากนั้นเปรียบเทียบผลลัพธ์ที่อัปสเกลด้วย AI กับผลลัพธ์ Lanczos ของ FFmpeg การอัปสเกลด้วย AI จัดการกับพื้นผิวและรายละเอียดปลีกย่อยได้ดีกว่าวิธีอัลกอริทึม FFmpeg นั้นเร็วกว่าและฟรี
ใช้ FFmpeg สำหรับงานคุณภาพมาตรฐาน และการอัปสเกลวิดีโอด้วย AI แบบ API สำหรับฟุตเทจที่คุณภาพมีความสำคัญสูงสุด
คำถามที่พบบ่อย (FAQ)
Lanczos ดีกว่า bicubic ทุกกรณีหรือไม่?
สำหรับการอัปสเกล ใช่ สำหรับการดาวน์สเกล bicubic มักจะเร็วกว่าและมีคุณภาพใกล้เคียงกัน Lanczos ใช้การคำนวณที่ซับซ้อนกว่า
vidstab ใช้กับวิดีโอที่ถ่ายจากโทรศัพท์ได้หรือไม่?
ได้ วิดีโอที่ถ่ายจากโทรศัพท์มักจะได้รับประโยชน์สูงสุดจากการทำให้ภาพนิ่ง พารามิเตอร์ shakiness ควรกำหนดให้สูง (8-10) สำหรับวิดีโอที่ถ่ายด้วยมือถือ
ต้องซูมเท่าไรเพื่อซ่อนขอบที่เกิดจากการทำให้ภาพนิ่ง?
โดยทั่วไป 3-8% ขึ้นอยู่กับว่าต้นฉบับสั่นไหวแค่ไหน ตั้งค่า optzoom=1 เพื่อให้ FFmpeg คำนวณให้โดยอัตโนมัติ
FFmpeg สามารถปรับปรุงฟุตเทจประวัติศาสตร์ความละเอียดต่ำได้หรือไม่?
ฟิลเตอร์ของ FFmpeg ช่วยได้แต่มีข้อจำกัด เครื่องมืออัปสเกลที่ใช้ AI (เช่น ESRGAN หรือ API ปรับปรุงวิดีโอเฉพาะทาง) ให้ผลลัพธ์ที่ดีกว่ามากสำหรับฟุตเทจที่เสื่อมสภาพอย่างรุนแรง
การลดสัญญาณรบกวนทำให้การเล่นช้าลงหรือไม่?
ไม่ การลดสัญญาณรบกวนเป็นขั้นตอนการประมวลผลระหว่างการแปลง ไม่ใช่เอฟเฟกต์แบบเรียลไทม์ วิดีโอที่ได้จะเล่นได้ตามปกติ
