[FFmpeg tutorial] Những câu lệnh FFmpeg xử lý video

Posted on October 13th, 2018

FFmpeg là một công cụ miễn phí mà rất mạnh trong việc xử lý hình ảnh, video, audio,... Nếu bạn chưa biết cách cài đặt FFmpeg, vui lòng tham khảo thêm tại bài viết hướng dẫn tìm hiểu FFmpeg cơ bản. Còn trong bài viết này, mình sẽ giúp bạn tổng hợp những câu lệnh FFmpeg xử lý video đơn giản và hiệu quả nhất. Mời bạn theo dõi bài viết!

Thay đổi kích thước video

Thay đổi kích thước video với kích thước xác định

Nếu bạn đơn giản muốn thay đổi kích thước video thành một kích thước xác định trước, thì bạn có thể sử dụng câu lệnh sau:

ffmpeg -i input.mp4 -vf scale=320:240 output.mp4

Trong đó:

  • ffmpeg: tên chương trình
  • -i: cờ xác định đầu vào (input)
  • input.mp4: tên video đầu vào
  • -vf: cờ xác định biểu thức cho việc scale video
  • scale=320:240: biểu thức để scale video
  • output.mp4: tên video đầu ra

Câu lệnh này scale video thành kích thước 320x240 (width=320 và height=240). Lúc này toàn bộ video sẽ bị co hoặc dãn đến kích thước 320x240.

Thay đổi kích thước video giữ nguyên tỉ lệ

Nếu chỉ sử dụng câu lệnh như trên thì rất có thể tỉ lệ width/height của video sẽ bị thay đổi, dẫn đến hình ảnh bị méo mó. Do đó, để giữ nguyên tỉ lệ video bạn có thể thay đổi câu lệnh trên một chút, bằng cách chỉ xác định width hoặc height, chiều còn lại bạn để -1, như sau đây.

Giữ nguyên chiều rộng:

ffmpeg -i input.mp4 -vf scale=320:-1 output.mp4

Giữ nguyên chiều cao:

ffmpeg -i input.mp4 -vf scale=-1:240 output.mp4

Chú ý: Một vài định dạng video yêu cầu chiều dài, chiều rộng phải chia hết cho số n(thường n = 2). Khi đó, bạn chỉ cần thay -1 thành -n.

Giữ nguyên chiều rộng:

ffmpeg -i input.mp4 -vf scale=320:-n output.mp4

Giữ nguyên chiều cao:

ffmpeg -i input.mp4 -vf scale=-n:240 output.mp4

Thay đổi kích thước video sử dụng biến số

Nhiều khi bạn sẽ muốn thay đổi kích thước video bằng cách nhân/chia chiều rộng/cao cho một số bất kỳ. Lúc này bạn có thể sử dụng biến số iw (chiều rộng), ih (chiều cao). Ví dụ, để tăng kích thước chiều rộng và chiều cao của video lên 2 lần bạn có thể sử dụng câu lệnh sau:

ffmpeg -i input.mp4 -vf scale=iw*2:ih*2 output.mp4

Ngược lại, nếu bạn muốn giảm kích thước video đi 2 lần, bạn có thể nhân 2 kích thước với 0.5:

ffmpeg -i input.mp4 -vf scale=iw*0.5:ih*0.5 output.mp4

hoặc chia 2 kích thước cho 2:

ffmpeg -i input.mp4 -vf scale=iw/2:ih/2 output.mp4

Tránh tăng kích thước của video có kích thước quá nhỏ

Giả sử, bạn muốn thu nhỏ kích thước video xuống thành 320x240. Nhưng thực tế, kích thước của video đã nhỏ hơn 320x240 rồi. Khi đó, bạn muốn giữ nguyên kích thước của video. Hay nói cách khác, bạn sẽ chỉ thu nhỏ kích thước của video xuống 320x240 nếu kích thước thực tế lớn hơn 320x240.

Lúc này, bạn có thể sử dụng biểu thức min:

ffmpeg -i input.mp4 -vf scale='min(320,iw)':'min(240,ih)' output.mp4

Làm cho video phù hợp với khung hình có sẵn

Trong trường hợp bạn muốn video của mình có kích thước phù hợp với một khung hình chữ nhật cho trước, mà vẫn muốn giữ nguyên tỉ lệ width/height. Khi đó bạn có thể sử dụng option forceoriginalaspect_ratio với 2 giá trị là:

  • decrease: video đầu ra sẽ tự động giảm kích thước nếu cần thiết
  • increase: video đầu ra sẽ tự động tăng kích thước nếu cần thiết

Ví dụ: đoạn code sau sẽ giảm kích thước của video để phù hợp với khung hình 320x240:

ffmpeg -i input.mp4 -vf scale=w=320:h=240:force_original_aspect_ratio=decrease output.mp4

Vì bạn giữ nguyên tỉ lệ video, nên rất có thể sẽ xuất hiện khoảng trống của video so với khung hình. Lúc này, bạn có thể sử dụng filter pad để điền đầy màu đen vào khoảng trống kia:

ffmpeg -i input.mp4 -vf "scale=320:240:force_original_aspect_ratio=decrease,pad=320:240:(ow-iw)/2:(oh-ih)/2" output.mp4

Xác định thuật toán scale

FFmpeg hỗ trợ nhiều loại thuật toán để scale video, bao gồm: fastbilinear, bilinear, bicubic, experimental, neighbor, area, bicublin, gauss, sinc, lanczos, spline, accuraternd, fullchromaint, fullchromainp, bitexact. Thuật toán mặc định là: bicubic.

Để có thể lựa chọn thuật toán thay đổi kích thước video, bạn cần sử dụng option -sws_flags.

Ví dụ, bạn muốn sử dụng thuật toán bilinear thay vì thuật toán mặc định bicubic thì có thể sử dụng câu lệnh sau:

ffmpeg -i input.mp4 -vf scale=320:240 -sws_flags bilinear output.mp4

Để sử dụng nhiều giá trị cho cờ trên, bạn có thể sử dụng dấu +, ví dụ:

ffmpeg -i input.mp4 -vf scale=320:240 -sws_flags lanczos+full_chroma_inp output.mp4

Thay đổi định dạng video

ffmpeg -i input.xxx output.yyy

Trong đó:

  • File đầu vào là input.xxx với xxx là các định dạng video của file đầu vào: mp4, avi, mpg, flv,…
  • File đầu ra là output.yyy với yyy cũng là các định dạng video của file đầu vào: mp4, avi, mpg, flv,…

Ví dụ, mình muốn chuyển từ định dạng mp4 sang flv, thì câu lệnh sẽ là:

ffmpeg -i input.mp4 output.flv

Thay đổi framerate của video

Video thường có rất nhiều giá trị framerate khác nhau như: 24, 25, 29.97, 30, 60,... Khi bạn muốn ghép nhiều video với nhau thì một trong những việc bạn cần phải làm là đưa chúng về cùng framerate.

Ví dụ, câu lệnh sau sẽ thay đổi framerate của video thành 25 (frame/second):

ffmpeg -i input.mp4 -r 25 output.mp4

Encode video thành chuẩn H264

Chuẩn H264 (MPEG-4 Part 10, MPEG-4 AVC) là một chuẩn mã hoá video rất phổ biến. Những video theo chuẩn H264 thường có đuôi là .mp4. Vì vậy, những video theo chuẩn này có thể play trên rất nhiều thiết bị khác nhau.

Để encode video thành chuẩn H264, bạn có thể sử dụng 2 phương pháp: Constant Rate Factor (CRF) hoặc Two-Pass ABR. Tuy nhiên, mình thấy phương pháp CRF có vẻ đơn giản hơn.

Ví dụ câu lệnh sau sẽ encode video về chuẩn H264 sử dụng CRF:

ffmpeg -i input.avi -c:v libx264 -preset slow -crf 22 -c:a copy output.mp4

Ngoài những thứ cơ bản mà mình đã nói ở các phần trên thì những thông tin bạn cần phải quan tâm đó là:

  • -c:v: cờ dùng để xác định thư viện dùng để encode h264
  • libx264: tên thư viện dùng để encode h264. Ngoài libx264, bạn có thể sử dụng lib h264. Nói vậy thôi, nhưng thực tế, h264 chỉ free cho việc decode h264. Trong khi đó, libx264 là free, open source cho cả decode và encode. Vì vậy, bạn nên sử dụng libx264.
  • -preset: cờ dùng để xác định preset được sử dụng. Giá trị này sẽ quyết định tốc độ mã hoá.
  • slow: tên preset sử dụng. Ngoài slow, bạn có thể dùng: ultrafast, superfast, veryfast, faster, fast, medium (default preset), slow, slower, veryslow. Trong dãy các giá trị trên, từ trái sang phải sẽ cho chất lượng video tăng dần, nhưng tốc độ mã hoá sẽ giảm dần. Hay nói cách khác, tốc độ mã hoá video càng chậm thì chất lượng video càng tốt.
  • -crf: cờ xác định hệ số CRF.
  • 22: hệ số CRF. Giá trị CRF có thể là từ 0 đến 51, với giá trị mặc định là 23. Giá trị CRF càng lớn thì chất lượng video càng giảm và ngược lại.
  • -c:a: cờ dùng để xác định thư viện encode audio.
  • copy: trong bài viết này, mình chỉ quan tâm tới video, nên audio sẽ không thay đổi. Hay nó sẽ được copy từ input sang output.

Thay đổi bitrate của video

Giả sử bạn đang muốn Live Streaming một video. Video này có bitrate cỡ 5Mbps. 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 -c:v libx264 -crf 23 -maxrate 1M -bufsize 2M output.mp4

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.
  • -crf 23: xác định hệ số CRF là 23

Lời kết

Trên đây là một số câu lệnh FFmpeg xử lý video rất phổ biến. Nếu có câu lệnh nào bạn chưa hiểu hoặc bạn cần phải xử lý video về một khía cạnh nào đó mà mình chưa chia sẻ thì bạn có thể để lại câu hỏi trong phần bình luận, mình sẽ cố gắng sưu tầm và chia sẻ lại với bạn.

Xin chào và hẹn gặp lại trong bài viết tiếp theo, thân ái!

Tham khảo


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