DEV Community

Cover image for Cách nâng cấp, cải thiện chất lượng video bằng FFmpeg: Tăng độ phân giải, khử nhiễu, chống rung
Sebastian Petrus
Sebastian Petrus

Posted on • Originally published at apidog.com

Cách nâng cấp, cải thiện chất lượng video bằng FFmpeg: Tăng độ phân giải, khử nhiễu, chống rung

Tóm tắt

FFmpeg nâng cấp độ phân giải video bằng lệnh -vf "scale=1920:1080:flags=lanczos". Lanczos là thuật toán mở rộng chất lượng cao nhất để upscale. Bộ lọc hqdn3d giúp khử nhiễu mà vẫn bảo toàn cạnh sắc nét. Ổn định video sử dụng vidstab với quy trình hai bước. Có thể kết hợp cả ba bộ lọc trong một chuỗi để cải thiện chất lượng video.

Dùng thử Apidog ngay hôm nay

Giới thiệu

Nâng cao chất lượng video với FFmpeg không chỉ là thay đổi độ phân giải. Quy trình thực tế gồm nâng cấp độ phân giải, khử nhiễu và ổn định video (tuỳ chọn). Mỗi bước xử lý vấn đề chất lượng khác nhau: làm nét cảnh mờ/vỡ điểm ảnh, giảm nhiễu hạt/ồn, và ổn định chuyển động rung lắc.

Bài viết hướng dẫn từng kỹ thuật riêng lẻ và cách kết hợp chúng thành quy trình tự động.

Thuật toán mở rộng

Thuật toán mở rộng quyết định cách FFmpeg tạo điểm ảnh mới khi upscale. Lựa chọn thuật toán ảnh hưởng rõ đến chất lượng:

Thuật toán Tốc độ Chất lượng Ứng dụng tốt nhất
neighbor Nhanh nhất Thấp nhất Nghệ thuật pixel
bilinear Nhanh Thấp Ưu tiên tốc độ
bicubic Trung bình Tốt Giảm kích thước chung
lanczos Chậm hơn Tốt nhất Nâng cấp độ phân giải

Nâng cấp lên 1080p sử dụng 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

Giữ nguyên tỷ lệ khung hình:

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

-2 giúp FFmpeg tự động tính chiều cao phù hợp, vẫn giữ đúng tỉ lệ và đảm bảo giá trị chẵn.

Mở rộng lên 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 cho x264 tối ưu hóa nén tốt hơn, đặc biệt quan trọng với độ phân giải cao.

Khử nhiễu với hqdn3d

Bộ lọc hqdn3d giúp khử nhiễu (noise reduction) mà vẫn giữ chi tiết cạnh.

Ví dụ khử nhiễu tiêu chuẩn:

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

Thứ tự tham số: luma_spatial:chroma_spatial:luma_temporal:chroma_temporal

  • luma_spatial (0–16): mức khử nhiễu không gian kênh sáng (mặc định 4)
  • chroma_spatial (0–16): kênh màu (mặc định 3)
  • luma_temporal (0–16): làm mịn theo thời gian kênh sáng (mặc định 6)
  • chroma_temporal (0–16): làm mịn theo thời gian kênh màu (mặc định 4.5)

Khử nhiễu mạnh:

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

Giá trị cao loại bỏ nhiều noise hơn nhưng có thể làm mờ chi tiết nhỏ.

Khử nhiễu nhẹ (giữ chi tiết):

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

Thử nghiệm với tham số khác nhau để chọn mức phù hợp.

Ổn định video với vidstab

Vidstab yêu cầu hai bước: phân tích chuyển động, rồi áp dụng ổn định.

Kiểm tra hỗ trợ vidstab:

ffmpeg -filters | grep vidstab
# Trên macOS: brew install ffmpeg (thường đã tích hợp vidstab)
Enter fullscreen mode Exit fullscreen mode

Bước 1: Phân tích chuyển động

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: mức rung máy dự kiến (1–10)
  • accuracy=9: độ chính xác phân tích (1–15)
  • Kết quả sinh file transform.trf phục vụ bước 2.

Bước 2: Ổn định video

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: thêm 1% zoom để tránh viền đen.
  • smoothing=10: độ mượt của chuyển động (cao hơn = mượt hơn).

Ổn định mạnh hơn:

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: tự động tối ưu hóa zoom để loại bỏ viền.

Quy trình cải thiện chất lượng kết hợp

Kết hợp các bộ lọc trong một chuỗi duy nhất:

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
  • Thứ tự khuyến nghị: Khử nhiễu → Mở rộng → Ổn định (giúp noise không bị upscale lên độ phân giải cao).

Lưu ý: Luôn chạy bước vidstabdetect trước khi áp dụng filter vidstabtransform trong chuỗi này.

Bộ lọc làm sắc nét

Cảnh quay mờ (blur) có thể cải thiện bằng filter làm sắc nét:

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
  • Tham số: lx:ly:la:cx:cy:ca
    • lx:ly — kích thước ma trận luma
    • la — mức độ sắc nét luma (dương = sharpen, âm = blur)
    • cx:cy:ca — tương tự cho chroma

Mức sắc nét nhẹ: unsharp=3:3:0.5:3:3:0.0

Mức sắc nét mạnh: unsharp=5:5:2.5:5:5:0.0

Hiệu suất và xử lý hàng loạt

Các thao tác nâng cao đòi hỏi thời gian xử lý đáng kể (ước tính cho video 1080p/10 phút):

  • Chỉ upscale: 2–5 phút
  • Upscale + hqdn3d: 5–10 phút
  • Upscale + hqdn3d + vidstab: 15–25 phút

Tối ưu với -preset:

  • ultrafast — nhanh nhất, file lớn
  • fast — cân bằng tốc độ/kích thước
  • slow — chậm, file nhỏ nhất với cùng CRF
  • veryslow — thường không cần thiết so với slow

Xử lý hàng loạt bằng GNU Parallel:

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

Kết nối với các API nâng cấp video AI

Để upscale bằng AI (kết quả tốt hơn filter FFmpeg với video chất lượng thấp), có thể dùng API chuyên biệt.

Ví dụ, WaveSpeedAI cung cấp API nâng cấp video bằng mô hình neural:

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

Kiểm thử API này với Apidog trước khi tích hợp:

Thêm xác nhận:

Mã trạng thái là 200
Phần thân phản hồi có trường id
Enter fullscreen mode Exit fullscreen mode

Gọi endpoint trạng thái để kiểm tra hoàn thành, sau đó so sánh kết quả AI với kết quả upscale Lanczos. AI có thể giữ texture và chi tiết nhỏ tốt hơn, trong khi FFmpeg ưu việt về tốc độ và miễn phí.

Khuyến nghị: Dùng FFmpeg cho nhu cầu tiêu chuẩn, dùng AI API cho cảnh quay chất lượng thấp hoặc yêu cầu cao về chi tiết.

Câu hỏi thường gặp

Lanczos có tốt hơn bicubic trong mọi trường hợp không?

Lanczos tốt nhất khi upscale, còn bicubic đủ nhanh và chất lượng tốt khi giảm kích thước.

Vidstab có ổn định video quay từ điện thoại không?

Có. Video từ smartphone rất phù hợp cho vidstab. Đặt shakiness=8-10 cho cảnh quay rung mạnh.

Cần zoom bao nhiêu để loại bỏ viền khi ổn định?

Thông thường 3-8%. Dùng optzoom=1 để tự động tính toán.

FFmpeg có cải thiện được video lịch sử độ phân giải thấp?

FFmpeg giúp được phần nào, nhưng AI (như ESRGAN hoặc API chuyên biệt) cho kết quả vượt trội trên video xuống cấp nặng.

Khử nhiễu có làm chậm phát lại video không?

Không. Khử nhiễu là bước xử lý khi chuyển đổi, video xuất ra phát lại bình thường.

Top comments (0)