[FFmpeg Tutorial] Convert video thành MP4 với FFmpeg

Posted on October 18th, 2018

MP4 là một trong những định dạng video phổ biến nhất. Vì nó được hỗ trợ bởi nhiều thiết bị khác nhau. Và đặc biệt là Youtube rất thích MP4. Do đó, bài viết này sẽ giới thiệu với bạn một số cách để convert video thành MP4.

Dĩ nhiên, MP4 chỉ là định dạng file. Nói về video codec thì bài viết này sẽ tập trung vào chuẩn H264.

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ả 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 presetultrafast, 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, veryslow cho 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

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 to 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.

Xem thêm: [FFmpeg Tutorial] Lấy thông tin video bằng FFmpeg

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ể.

Tham khảo: H.264 Video Encoding Guide

★ 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é: