AI & Automation (vnROM)

Cover image for (share) Fix lỗi video bị giật/lag khi render tự động bằng n8n + FFmpeg: Vấn đề nằm ở FPS
Mascot
Mascot

Posted on

(share) Fix lỗi video bị giật/lag khi render tự động bằng n8n + FFmpeg: Vấn đề nằm ở FPS

Chào anh em,

Hôm nay mình muốn chia sẻ một kinh nghiệm "xương máu" khi làm automation video với n8n. Mình đã mất gần cả ngày trời để mò mẫm xem tại sao workflow chạy trơn tru, không báo lỗi, nhưng video xuất ra cứ bị khựng, giật, cảm giác không mượt (stutter), dù bitrate để rất cao.

Hóa ra, nguyên nhân đến từ một thứ rất cơ bản mà mình chủ quan bỏ qua: FPS (Frames Per Second).

Vấn đề gặp phải:
Nguồn video đầu vào (source) thường có FPS không đồng nhất (lúc thì 23.976, lúc 29.97, hoặc tệ hơn là Variable FPS - VFR từ điện thoại). Khi n8n gọi FFmpeg để cắt ghép hay xử lý mà không ép lại FPS chuẩn ngay từ đầu, video thành phẩm sẽ bị lệch frame, dẫn đến hiện tượng giật hình, nhất là khi upload lên YouTube/Shorts/Reels.

Giải pháp:
Bắt buộc phải Chuẩn hóa FPS (Normalize) về một con số cố định (thường là 30 hoặc 60) trước khi làm bất kỳ bước nào khác.

Dưới đây là 2 đoạn script mình đang dùng trong Node "Execute Command" của n8n, chạy rất ổn định.

1. Script chuẩn hóa video (Convert về 30fps, 1080p chuẩn)

Dùng cho trường hợp anh em muốn đồng bộ kho video nguồn.

sh -c '
mkdir -p /home/node/videos/YT-MA/MP5

for f in /home/node/videos/YT-MA/MP5/A/*.mp4; do
  name=$(basename "$f")
  out="/home/node/videos/YT-MA/MP5/$name"

  echo "👉 Processing $name"

  ffmpeg -y \
    -i "$f" \
    -vf "scale=1920:1080:flags=lanczos,fps=30,setsar=1" \
    -c:v libx264 \
    -preset slow \
    -crf 20 \
    -profile:v high \
    -level 4.2 \
    -pix_fmt yuv420p \
    -x264-params keyint=60:min-keyint=60:scenecut=0 \
    -movflags +faststart \
    "$out"
done
'

Enter fullscreen mode Exit fullscreen mode

Giải thích thông số quan trọng:

  • fps=30: Ép cứng frame rate, chữa bệnh giật hình.
  • setsar=1: Fix lỗi tỉ lệ pixel (tránh video bị méo).
  • keyint=60: Đặt keyframe mỗi 2 giây (với 30fps), giúp việc tua video mượt hơn và tương thích tốt với các nền tảng streaming.
  • movflags +faststart: Giúp video load ngay lập tức khi người xem bấm play trên web.

2. Script cắt nhỏ video 5s (Dành cho làm Shorts/Reels hàng loạt)

Đoạn này vừa chuẩn hóa FPS, vừa băm nhỏ video ra để làm nguyên liệu dựng tự động.

sh -c '
SRC="/home/node/videos/YT-MA/MP4"
DST="/home/node/videos/YT-MA/MP5"

mkdir -p "$DST"

for f in "$SRC"/*.mp4; do
  [ -f "$f" ] || continue

  name=$(basename "$f" .mp4)
  echo "👉 Processing $name.mp4"

  ffmpeg -y \
    -i "$f" \
    -vf "scale=1920:1080:flags=lanczos,fps=30,setsar=1" \
    -map 0:v:0 \
    -an \
    -c:v libx264 \
    -preset slow \
    -crf 18 \
    -profile:v high \
    -level 4.1 \
    -pix_fmt yuv420p \
    -x264-params keyint=60:min-keyint=60:scenecut=0 \
    -movflags +faststart \
    -f segment \
    -segment_time 5 \
    -reset_timestamps 1 \
    "$DST/${name}_%03d.mp4"
done
'

Enter fullscreen mode Exit fullscreen mode

Anh em làm tool auto video lưu ý kỹ vụ FPS này nhé. Code đúng logic mà FPS lệch thì sản phẩm vẫn vứt đi như thường.

Bác nào có cao kiến tối ưu FFmpeg hơn cho n8n thì comment chỉ giáo mình với nhé!

Chia sẻ: Kim Linh

Top comments (0)