DEV Community

Cover image for วิธีเพิ่มคุณภาพวิดีโอด้วย FFmpeg: ขยาย, ลดสัญญาณรบกวน, ป้องกันภาพสั่น
Thanawat Wongchai
Thanawat Wongchai

Posted on • Originally published at apidog.com

วิธีเพิ่มคุณภาพวิดีโอด้วย FFmpeg: ขยาย, ลดสัญญาณรบกวน, ป้องกันภาพสั่น

สรุปสั้นๆ (TL;DR)

FFmpeg อัปสเกลวิดีโอด้วย -vf "scale=1920:1080:flags=lanczos" — Lanczos เป็นอัลกอริทึมการปรับขนาดที่เหมาะสำหรับการอัปสเกล สำหรับการลดสัญญาณรบกวน (denoising) ใช้ hqdn3d เพื่อลดเกรนโดยไม่เสียรายละเอียดขอบ สำหรับการทำให้ภาพนิ่ง (stabilization) ใช้ vidstab จัดการกับการสั่นของกล้องผ่านกระบวนการสองขั้นตอน สามารถรวมทั้งสามขั้นตอนในคำสั่งเดียวเพื่อเพิ่มคุณภาพวิดีโอ

ทดลองใช้ Apidog วันนี้

บทนำ

การเพิ่มคุณภาพวิดีโอด้วย FFmpeg ไม่ใช่แค่การเปลี่ยนความละเอียด แต่ควรผสานการอัปสเกล, ลดสัญญาณรบกวน และทำให้ภาพนิ่ง (ถ้าจำเป็น) แต่ละขั้นตอนช่วยแก้ปัญหา: ภาพเบลอ/เป็นพิกเซล, เฟรมที่มีเกรน, และการสั่นของกล้อง

บทความนี้แนะนำเทคนิคแต่ละแบบและวิธีใช้งานร่วมกัน

อัลกอริทึมการปรับขนาด (Scaling algorithms)

อัลกอริทึมการปรับขนาดมีผลอย่างมากต่อคุณภาพของวิดีโอหลังอัปสเกล เลือกอัลกอริทึมที่เหมาะสมตามงาน:

อัลกอริทึม ความเร็ว คุณภาพ เหมาะกับงาน
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
Enter fullscreen mode Exit fullscreen mode

รักษาสัดส่วนภาพ:

ffmpeg -i input.mp4 -vf "scale=1920:-2:flags=lanczos" -c:v libx264 -crf 20 output.mp4
Enter fullscreen mode Exit fullscreen mode

-2 จะคำนวณความสูงโดยอัตโนมัติและแน่ใจว่าหารด้วย 2 ลงตัว

อัปสเกลเป็น 4K:

ffmpeg -i input.mp4 -vf "scale=3840:-2:flags=lanczos" -c:v libx264 -crf 18 -preset slow output_4k.mp4
Enter fullscreen mode Exit fullscreen mode

-preset slow ทำให้ x264 ใช้เวลามากขึ้นเพื่อคุณภาพการบีบอัดที่ดีขึ้น


การลดสัญญาณรบกวนด้วย hqdn3d (Denoising with hqdn3d)

ฟิลเตอร์ hqdn3d ช่วยขจัดเกรน/สัญญาณรบกวนและรักษาขอบคม

ffmpeg -i noisy_video.mp4 -vf "hqdn3d=4:3:6:4.5" -c:v libx264 -crf 20 denoised.mp4
Enter fullscreen mode Exit fullscreen mode

อธิบาย parameter:

hqdn3d=luma_spatial:chroma_spatial:luma_temporal:chroma_temporal

  • luma_spatial (0-16): ลดนอยส์ช่องความสว่าง (default 4)
  • chroma_spatial (0-16): ลดนอยส์ช่องสี (default 3)
  • luma_temporal (0-16): ลดนอยส์ temporal ช่องความสว่าง (default 6)
  • chroma_temporal (0-16): ลดนอยส์ temporal ช่องสี (default 4.5)

ลดสัญญาณรบกวนแรงขึ้น:

ffmpeg -i grainy.mp4 -vf "hqdn3d=10:8:15:10" -c:v libx264 -crf 20 clean.mp4
Enter fullscreen mode Exit fullscreen mode

ค่าที่สูงขึ้นจะลดนอยส์มากขึ้นแต่เสี่ยงเบลอรายละเอียด ลองปรับค่าก่อนใช้งานจริง

ลดสัญญาณรบกวนแบบเบา (คงรายละเอียด):

ffmpeg -i video.mp4 -vf "hqdn3d=2:1.5:3:2.5" -c:v libx264 -crf 20 output.mp4
Enter fullscreen mode Exit fullscreen mode

การทำให้ภาพนิ่งด้วย vidstab (Stabilization with vidstab)

Vidstab ต้องประมวลผล 2 รอบ: วิเคราะห์การเคลื่อนไหว → ทำให้ภาพนิ่ง

ตรวจสอบว่า FFmpeg รองรับ vidstab:

ffmpeg -filters | grep vidstab
Enter fullscreen mode Exit fullscreen mode

macOS: ติดตั้งผ่าน brew install ffmpeg จะมี vidstab

1. วิเคราะห์การเคลื่อนไหว:

ffmpeg -i shaky_video.mp4 -vf "vidstabdetect=stepsize=6:shakiness=8:accuracy=9:result=transform.trf" -f null -
Enter fullscreen mode Exit fullscreen mode
  • shakiness=8 (1-10): ระดับการสั่น
  • accuracy=9 (1-15): ความแม่นยำ
  • ผลลัพธ์ไฟล์ .trf สำหรับขั้นตอนต่อไป

2. ทำให้ภาพนิ่ง:

ffmpeg -i shaky_video.mp4 -vf "vidstabtransform=input=transform.trf:zoom=1:smoothing=10" -c:v libx264 -crf 20 stabilized.mp4
Enter fullscreen mode Exit fullscreen mode
  • zoom=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
Enter fullscreen mode Exit fullscreen mode
  • 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
Enter fullscreen mode Exit fullscreen mode

ลำดับ: ลดนอยส์ → อัปสเกล → ทำให้ภาพนิ่ง

โปรดรัน vidstabdetect ก่อนรันคำสั่งนี้


ฟิลเตอร์ปรับความคมชัด (Sharpening filter)

ถ้าภาพดูนุ่มหลังลดนอยส์ ใช้ฟิลเตอร์ unsharp:

ffmpeg -i video.mp4 -vf "unsharp=5:5:1.5:5:5:0.5" -c:v libx264 -crf 20 sharpened.mp4
Enter fullscreen mode Exit fullscreen mode

parameter: lx:ly:la:cx:cy:ca

  • 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 — ช้า, ไฟล์เล็ก
  • veryslow — ช้ามาก ไม่คุ้มเวลา

ประมวลผลหลายไฟล์พร้อมกันด้วย parallel:

ls *.mp4 | parallel ffmpeg -i {} -vf "scale=1920:-2:flags=lanczos" -c:v libx264 -crf 20 enhanced_{/}
Enter fullscreen mode Exit fullscreen mode

การเชื่อมต่อกับ API การอัปสเกลวิดีโอด้วย AI

สำหรับการอัปสเกลวิดีโอด้วย AI (คุณภาพสูงกว่า filter 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
}
Enter fullscreen mode Exit fullscreen mode

ทดสอบ endpoint นี้ด้วย Apidog ก่อนเชื่อมต่อจริง:

เพิ่ม assertions:

Status code is 200
Response body has field id
Enter fullscreen mode Exit fullscreen mode

สอบถามสถานะ endpoint ตรวจสอบความสมบูรณ์

เปรียบเทียบผลอัปสเกล AI กับ Lanczos จาก FFmpeg

AI จัดการรายละเอียดผิวและ texture ได้ดีกว่า FFmpeg

แต่ FFmpeg เร็วกว่าและฟรี

สรุป:

ใช้ FFmpeg สำหรับงานมาตรฐาน

ใช้ API/AI สำหรับวิดีโอที่ต้องการคุณภาพสูงสุด


คำถามที่พบบ่อย (FAQ)

Lanczos ดีกว่า bicubic เสมอหรือไม่?

  • สำหรับอัปสเกล: ใช่
  • สำหรับดาวน์สเกล: bicubic เร็วและคุณภาพใกล้เคียงกัน

vidstab ใช้กับวิดีโอโทรศัพท์มือถือได้ไหม?

  • ได้ แนะนำตั้งค่า shakiness สูง (8-10) สำหรับวิดีโอมือถือ

ต้องซูมเท่าไรเพื่อซ่อนขอบที่เกิดจากการทำให้ภาพนิ่ง?

  • โดยทั่วไป 3-8% หรือใช้ optzoom=1 ให้ FFmpeg คำนวณให้

FFmpeg ปรับปรุงฟุตเทจประวัติศาสตร์ความละเอียดต่ำได้ไหม?

  • ฟิลเตอร์ FFmpeg ช่วยได้แต่จำกัด
  • AI (เช่น ESRGAN หรือ API เฉพาะ) ผลลัพธ์ดีกว่าสำหรับวิดีโอเสื่อมสภาพ

การลดสัญญาณรบกวนทำให้การเล่นช้าลงหรือไม่?

  • ไม่ เป็นขั้นตอนประมวลผลก่อน export วิดีโอที่ได้เล่นได้ตามปกติ

Top comments (0)