[FFmpeg Tutorial] Ghép nối video với FFmpeg

Posted on October 30th, 2018

Ghép nối video với FFmpeg là một chủ đề khá khó. Vì các video thường có kích thước, định dạng và tốc độ framerate khác nhau. Vì vậy, trước khi thực hiện ghép nối video, bạn cần phải kiểm tra thông tin của video và xử lý chúng về cùng định dạng, kích thước, tốc độ framerate và SAR. Sau khi làm xong những việc đó, mình bắt đầu thực hiện ghép nối.

Ghép nối video với FFmpeg đơn giản

Nếu bạn có 2 hay nhiều video định dạng avi hoặc mpg thì có thể sử dụng câu lệnh sau:

ffmpeg -i "concat:video1.avi|video2.avi" output.avi

Trong đó:

  • -i là cờ dùng để xác định input, sau đó là đoạn string có dạng "concat:video1.avi|video2.avi|...|videoN.avi".
  • output.avi là tên file output, với định dạng giống như các file input.

Đối với video dạng MP4, WEBM, MKV thì bạn không thể sử dụng câu lệnh trên được mà cần phải sử dụng cách sau đây.

Ghép nối video sử dụng Concat Filter

Nếu sử dụng cách này, bạn có thể ghép nối video với các định dạng khác nhau.

Giả sử mình cần ghép 1 video MP4 với 1 video AVI thì câu lệnh là:

ffmpeg -i video1.mp4 -i video2.avi -filter_complex "[0:v:0] [0:a:0] [1:v:0] [1:a:0] concat=n=2:v=1:a=1 [v] [a]" -map "[v]" -map "[a]" output.mp4

Trong đó:

  • -i là cờ dùng để xác định input, sau đó là tên file (video1.mp4, video2.avi)
  • -filter_complex dùng để áp dụng filter, sau đó là công thức filter - nằm trong cặp dấu ngoặc kép
    • [0:v:0] là video stream của file thứ nhất
    • [0:a:0] là audio stream của file thứ nhất
    • [1:v:0] là video stream của file thứ hai
    • [1:a:0] là audio stream của file thứ hai
    • concat=n=2:v=1:a=1 để xác định FFmpeg sẽ ghép nối (concat) 2 video (n=2) thành 1 video với 1 video stream (v=1) và 1 audio stream (a=1).
    • [v] [a] lần lượt là kết quả của video stream và audio stream, để sử dụng trong phần sau
  • -map "[v]" -map "[a]" dùng để xác định rằng FFmpeg sẽ sử dụng video stream và audio stream từ bước trước (thay vì input) để đưa ra output.
  • output.mp4 là tên file output

Chú ý: Nếu file input có kích thước, tốc độ framerateSAR khác nhau thì bạn cần phải xử lý video trước cho chúng về cùng kích thước, cùng tốc độ framerate và cùng SAR.

Trên đây là cách để ghép nối 2 video. Còn nếu bạn muốn ghép 3 video (hoặc nhiều hơn) thì câu lệnh sẽ trở thành:

ffmpeg -i video1.mp4 -i video2.avi -i video3.webm -filter_complex "[0:v:0] [0:a:0] [1:v:0] [1:a:0] [2:v:0] [2:a:0] concat=n=3:v=1:a=1 [v] [a]" -map "[v]" -map "[a]" output.mp4

Ghép nối video không có audio

Nếu bạn muốn ghép nối video nhưng trong đó không có audio stream, bạn chỉ cần áp dụng công thức tương tự như trên nhưng bỏ đi những thành phần liên quan đến audio là được.

ffmpeg -i video1.mp4 -i video2.avi -filter_complex "[0:v:0] [1:v:0] concat=n=2:v=1 [v]" -map "[v]" output.mp4

Lời kết

Trên đây là một số cách để ghép nối video với FFmpeg. Nếu có gì thắc mắc hay góp ý, bạn vui lòng để lại câu hỏi xuống phần bình luận. Mình sẽ cố gắng giải đáp.

Tham khảo: Concatenating media files

★ Nếu bạn thấy bài viết này hay thì hãy theo dõi mình trên Facebook/Youtube để nhận được thông báo khi có bài viết mới nhất nhé: