Sách

Thứ Hai, 4 tháng 3, 2019

[ffmpeg Tutorial] Cut Video Với Ffmpeg

Câu lệnh cơ bản

Ví dụ để cắt video từ thời điểm 2 giây, với thời lượng cắt là 3 giây, câu lệnh cần dùng là:
ffmpeg -i input.mp4 -ss 00:00:02.0000 -t 3 output.mp4
Trong đó:
  • -i là cờ dùng để xác định input, sau đó là tên file (input.mp4)
  • -ss (start timestamp) dùng để xác định thời điểm bắt đầu cắt video, theo định dạng (giờ:phút:giây:mili-giây). Trong câu lệnh trên 00:00:02.0000 ứng với thời điểm giây thứ 2. Ngoài ra, nếu bạn chỉ dùng -ss 2 thì FFmpeg cũng mặc định hiểu rằng, đó là thời điểm 2 giây.
  • -t là cờ dùng để xác định thời lượng bạn muốn cắt. Sau đó là con số chỉ thời lượng đó, ở đây là 3 giây.
  • output.mp4 là tên file output
Trong câu lệnh trên, ngoài tham số -t, bạn có thể sử dụng tham số -to để thay thế. Tham số -todùng đề xác định thời điểm kết thúc bạn muốn cắt video. Ví dụ mình muốn cắt video ở thời điểm 5 giây thì có thể sử dụng một trong 2 câu lệnh dưới đây:
ffmpeg -i input.mp4 -ss 00:00:02.0000 -to 00:00:05.0000 output.mp4

# Hoặc
ffmpeg -i input.mp4 -ss 2 -to 5 output.mp4
Kết quả thu được hoàn toàn giống với câu lệnh ban đầu.
Tuy nhiên, có một điều bạn cần lưu ý là câu lệnh trên sẽ encode lại video dựa theo những tham số mặc định của FFmpeg. Nếu bạn muốn giữ nguyên thông tin video, không encode lại video thì mời bạn theo dõi phần dưới đây.

Không encode lại video

Để làm điều này, bạn có thể sử dụng thêm option -c copy (hoặc -vcodec copy với video và -acodec copy với audio) để FFmpeg copy trực tiếp video từ input sang output mà không cần phải encode lại video nữa.
Điều này có 2 ưu điểm:
  • Giữ nguyên chất lượng video ban đầu
  • Giúp cắt video nhanh hơn
Câu lệnh cần dùng là:
ffmpeg -i input.mp4 -ss 2 -t 3 -c copy output.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] Crop Video Với Ffmpeg

Crop video với FFmpeg

Câu lệnh cơ bản

ffmpeg -i input.mp4 -vf "crop=w:h:x:y" output.mp4
Trong đó:
  • -i là cờ dùng để xác định input, sau đó là tên file (input.mp4)
  • -vf dùng để thông báo việc sử dụng video filter. Tiếp theo đó là công thức sử dụng. Để crop video với FFmpeg thì mình sử dụng công thức là crop=w:h:x:y.
    • w: là chiều rộng video mà bạn muốn thu được.h: là chiều cao video mà bạn muốn thu được.x: là toạ độ trên trục x điểm top, left của video mong muốn, mặc định x = 0.y: là toạ độ trên trục y điểm top, left của video mong muốn, mặc định y = 0.
  • output.mp4 là tên file output

Hệ trục toạ độ

Có thể bạn vẫn chưa hiểu rõ câu lệnh trên cho lắm. Nên mình đã chuẩn bị một hình minh hoạ cho bạn dễ hiểu hơn:


Hệ trục tọa độ trên video
Hệ trục tọa độ trên video

Ví dụ minh hoạ

Giả sử mình có một video với độ phân giải 1920×1080. Mình muốn crop lấy video với độ phân giải 1280×720 và điểm top, lef có toạ độ là (320, 180).
Khi đó, mình có w = 1280, h = 720, x = 320, y = 180. Suy ra câu lệnh cần dùng là:
ffmpeg -i input.mp4 -vf "crop=1280:720:320:180" output.mp4

Sử dụng biến số

Trong ví dụ trên, mình cố tình cắt lấy video nằm ở chính giữa của video gốc (cách đều 4 phía).
Vì mình đã chủ động tính toán:
  • x = 320 = (1920 – 1280) / 2
  • y = 180 = (1080 – 720) / 2
Hay tổng quát hoá: để cắt lấy video có kích thước w, h từ video gốc W, H và cách đều 4 phíathì:
  • x = (W – w) / 2
  • y = (H – h) / 2
Trong đó:
  • Giá trị w, h là giá trị mình mong muốn
  • Giá trị W, H là giá trị kích thước video ban đầu. Dĩ nhiên, bạn có thể lấy được kích thước của video này thủ công. Hoặc bạn có thể sử dụng biến số có sẵn cung cấp bởi FFmpeg. Đó là in_w tương ứng với chiều rộng video gốc, in_h tương ứng với chiều cao video gốc.
Nếu áp dụng biến số này thì câu lệnh trong ví dụ trên trở thành:
ffmpeg -i input.mp4 -vf "crop=1280:720:(in_w-1280)/2:(in_h-720)/2" output.mp4

Lời kết

Trên đây là cách để crop 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ía dưới. Mình sẽ cố gắng giải đáp nhé!
Xin chào và hẹn gặp lại!

[ffmpeg Tutorial] Convert Video Thành Mp4 Với Ffmpeg

Câu lệnh cơ bản convert video thành MP4

Giả sử mình có 1 video dạng flv và muốn convert nó thành mp4. Khi đó, câu lệnh cơ bản cần dùng là:
ffmpeg -i input.flv output.mp4 -hide_banner
Trong đó:
  • -i là cờ dùng để xác định input, sau đó là tên file (input.flv)
  • output.mp4 là tên file output. Đặc biệt, FFmpeg sẽ dựa vào phần đuôi .mp4 để xác định rằng nó sẽ convert ra file MP4 với chuẩn H264 dành cho video và chuẩn aac dành cho audio.
  • -hide_banner dùng để ẩn những thông tin liên quan đến FFmpeg (phiên bản, các thư viện sử dụng,…)
Kết quả:

Kết quả convert video thành MP4 cơ bản
Kết quả convert video thành MP4 cơ bản

Kết quả cho ra file output.mp4 với kích thước khá nhỏ ~ 600KB, so với video gốc ~ 4MB (có gì đó không ổn thì phải).

Sử dụng một số tuỳ chọn cơ bản

Trong phần trước, khi bạn sử dụng câu lệnh cơ bản thì FFmpeg sẽ dùng những thông số mặc định để convert video thành MP4.
Thường thì kết quả thu được là khá OK rồi. Tuy nhiên, sẽ có những lúc kết quả thu được không tốt lắm, chất lượng video bị giảm đi đáng kể.
Lúc này, bạn cần phải tuỳ chỉnh các thông số sao cho hợp lý để thu được kết quả như mong muốn.
Ví dụ:
ffmpeg -i input.flv -f mp4 -vcodec libx264 -preset medium -profile:v baseline -acodec aac output-custom-1.mp4 -hide_banner

Ý nghĩa các tùy chọn

  • -i là cờ dùng để xác định input, sau đó là tên file (input.flv)
  • -f là cờ để xác định format đầu ra, tiếp theo là tên format (ở đây là mp4)
  • -vcodec libx264 là cờ để xác định codec sử dụng cho video. Ở đây, mình sử dụng libx264 vì đó là thư viện dùng để encode video theo chuẩn H264. Ngoài ra, bạn có thể thay thế nó bằng -c:v libx264 cũng cho kết quả tương tự.
  • -preset medium để xác định preset sử dụng là medium. FFmpeg hỗ trợ các loại preset là ultrafast, superfast, veryfast, faster, fast, medium, slow, slower và veryslow. Trong đó, ultrafast cho phép encode nhanh nhất, nhưng chất lượng thấp nhất. Ngược lại, veryslowcho phép encode chậm nhất nhưng chất lượng tốt nhất.
  • -profile:v baseline dùng để xác định profile sử dụng cho video là baseline. FFmpeg hỗ trợ một số loại profile là: baseline, main, high, high10, high422, và high444. Trong đó, mỗi profile cho phép video thu được tương thích với các loại thiết bị khác nhau. Trong đó, profile baseline được hỗ trợ bởi hầu hết mọi loại thiết bị.
  • -acodec aac là cờ xác định codec sử dụng cho audio là aac. Tương tự như với video, ở đây bạn cũng có thể sử dụng -c:a aac vẫn cho kết quả tương tự.
  • output-custom-1.mp4 là tên file output.
  • -hide_banner dùng để ẩn những thông tin liên quan đến FFmpeg (phiên bản, các thư viện sử dụng,…)
Kết quả:

Convert video thành MP4 sử dụng thêm tùy chọn
Convert video thành MP4 sử dụng thêm tùy chọn

Kích thước output lần này lớn hơn bên trên 1 chút, cỡ ~ 700KB. Nhưng chất lượng thì khác bọt. Bạn cứ thử đi rồi sẽ thấy.

Sử dụng một số tuỳ chọn khác

Ngoài những tuỳ chọn cơ bản trên, bạn còn có thể sử dụng thêm các tuỳ chọn khác như sau.

CRF (Constant Rate Factor)

CRF là hệ số dùng để xác định chất lượng mong muốn của video. Nó có giá trị từ 0 đến 51, và mặc định là 23.
Giá trị CRF càng nhỏ thì chất lượng video càng tốt. Ngược lại, giá trị CRF càng cao thì chất lượng video càng kém.
Đặc biệt, với CRF = 0, người ta thu được video dạng lossless (không suy giảm).
Ví dụ:
ffmpeg -i input.flv -c:v libx264 -c:a aac -preset medium -crf 0 output-custom-2.mp4 -hide_banner
Trong đó, thông tin quan trọng là:
  • -crf 0 để xác định hệ số CRF = 0
Kết quả:

Convert video thành MP4 sử dụng CRF

Kích thước output lần này thậm chí còn lớn hơn video gốc, cỡ ~ 10MB. Tuy nhiên, kết quả theo mình thấy thì cũng không tốt hơn là mấy.
Thực tế, giá trị CRF hợp lý sẽ là 17 hoặc 18 để có thể cân bằng giữa chất lượng và dung lượng video.

Bitrate

Giả sử bạn đang muốn Live Streaming một video. Video này có bitrate cỡ 4Mbps. Tuy nhiên, tốc độ mạng cho phép chỉ trong khoảng 1Mbps. Lúc này, bạn cần phải giảm bitrate của video xuống nhỏ hơn 1Mbps.
Ví dụ câu lệnh sau sẽ giới hạn bitrate của video xuống nhỏ hơn hoặc bằng 1Mbps:
ffmpeg -i input.flv -c:v libx264 -crf 17 -maxrate 1M -bufsize 2M output-custom-3.mp4 -hide_banner
Trong đó, những giá trị quan trọng là:
  • maxrate 1M: xác định bitrate tối đa là 1Mbps
  • bufsize 2M: xác định buffer cho việc encode video là 2MB.
Kết quả:

Convert video thành MP4 với bitrate

Ngoài ra, để kiểm tra lại xem bitrate của video bằng bao nhiêu, bạn sử dụng câu lệnh:
ffmpeg -i output-custom-3.mp4 -hide_banner
Kết quả:

Xem thông tin video

Rõ ràng, video output có bitrate là 776 kb/s, thoả mãn điều kiện maxrate 1Mb/s.

Cờ faststart dành cho web video

Cờ này là bắt buộc nếu bạn muốn dùng video online. Vì FFmpeg sẽ đưa những thông tin metadata cần thiết của video lên trên đầu của file. Nhờ đó mà video có thể play khi mà nó chưa load xong.
Câu lệnh cơ bản:
ffmpeg -i input.flv -movflags faststart output-custom-4.mp4 -hide_banner

Lời kết

Trên đây là một số cách để convert video thành mp4. Dĩ nhiên, bạn có thể kết hợp các câu lệnh đó lại với nhau để thu được kết quả như mong muốn.
Nếu có gì thắc mắc, vui lòng để lại câu hỏi trong phần bình luận nhé. Mình sẽ cố gắng giải đáp nếu có thể.
Xin chào và hẹn gặp lại!