Sách

Thứ Hai, 4 tháng 3, 2019

[ffmpeg Tutorial] Split Video Với Ffmpeg

Câu lệnh cơ bản để split video với FFmpeg

Giả sử mình có một video dài 1 tiếng (60 phút) và mình muốn chia nhỏ video này thành các phần nhỏ hơn, mỗi phần có độ dài 5 phút. Khi đó, câu lệnh FFmpeg là:
ffmpeg -i input.mp4 -c copy -f segment -segment_time 300 -reset_timestamps 1 %03d.mp4
Trong đó:
  • -i là cờ dùng để xác định input, sau đó là tên file (input.mp4).
  • -c copy dùng để thông báo với FFmpeg rằng bạn muốn copy video và audio từ input sang output mà không phải encode lại. Tham số này tương đương với -vcodec copy -acodec copy.
  • -f segment nghĩa là bạn muốn chia video này thành các segment (đoạn).
  • -segment_time 300: xác định độ dài mỗi đoạn là 300 giây (tương đương với 5 phút).
  • -reset_timestamps 1: để bắt mỗi segment bắt đầu với timestamp sấp xỉ 0.
  • %03d.mp4: định dạng file output. Trong trường hợp này, tên các file có độ dài là 3 kí tự, tức 001.mp4, 002.mp4,…

Lời kết

Trên đây là cách để cut 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.
Xin chào và hẹn gặp lại!

[ffmpeg Tutorial] Ghép Nối Video Với Ffmpeg

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ứ haiconcat=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 độ framerate và SAR 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.
Xin chào và hẹn gặp lại!

[ffmpeg Tutorial] Tách Audio Từ Video Với Ffmpeg

Tách audio từ video giữ nguyên gốc

Trước khi làm việc này bạn cần phải biết định dạng audio sử dụng trong một số loại video, ví dụ:
  • Nếu video định dạng MP4 thì audio dạng .aac
  • Nếu video định dạng WEBM thì audio dạng .oga
  • … (chắc còn nhiều nhưng mình không rành lắm)
Giả sử mình muốn tách nguyên gốc audio từ video MP4, thì câu lệnh là:
ffmpeg -i input.mp4 -vn -acodec copy output.aac
Trong đó:
  • -i là cờ dùng để xác định input, sau đó là tên file (input.mp4)
  • -vn là cờ dùng để xác định rằng mình không sử dụng video ở output
  • -acodec copy là cờ dùng để xác định rằng FFmpeg sẽ copy audio từ input sang output mà không encode lại.
  • output.aac là tên file output
Kết quả là mình đã có một file raw audio là output.aac.

Tách audio từ video và encode sang định dạng khác

Bạn có thể tách audio từ video rồi encode nó sang định dạng khác quen thuộc hơn, như mp3, wma,…
Giả sử mình muốn encode video thành mp3 thì câu lệnh là:
ffmpeg -i input.mp4 -vn output.mp3
Câu lệnh này gần giống câu lệnh trên. Chỉ khác ở chỗ mình bỏ qua tham số liên quan đến copy audio (-acodec copy) và file audio đầu ra với đuôi là định dạng mình muốn convert (mp3).
FFmpeg sẽ dựa vào đuôi này để biết rằng nó sẽ phải encode audio như thế nào.
Ngoài ra, bạn cũng có thể chỉ định rõ định dạng output theo chuẩn nào.

Tách audio thành mp3

ffmpeg -i input.mp4 -vn -acodec mp3 output.mp3

Tách audio thành aac

ffmpeg -i input.mp4 -vn -acodec aac output.aac

Tách audio thành vorbis

ffmpeg -i input.mp4 -vn -acodec libvorbis output.oga
Chú ý: Nếu làm theo cách này, bạn cần biết rõ định dạng file tương ứng với chuẩn encode.
  • -acodec mp3 ứng với định dạng .mp3
  • -acodec aac ứng với định dạng .aac
  • -acodec libvorbis ứng với định dạng .oga

Lời kết

Trên đây là một số cách để tách audio từ 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.
Xin chào và hẹn gặp lại!