
FFmpeg là một dự án phần mềm mã nguồn mở miễn phí, gồm bộ sưu tập thư viện và chương trình xử lý video, âm thanh cùng các tệp đa phương tiện và luồng dữ liệu khác. Cốt lõi của dự án là công cụ dòng lệnh ffmpeg, được dùng để chuyển mã (transcoding) định dạng, cắt ghép cơ bản, thay đổi kích thước hình ảnh, áp dụng hiệu ứng dựng phim và tuân thủ các tiêu chuẩn ngành. Vì hỗ trợ gần như mọi định dạng codec phổ biến lẫn hiếm, FFmpeg gần như đã trở thành tiêu chuẩn công nghiệp cho mọi tác vụ xử lý media.

Ba công cụ dòng lệnh chính
FFmpeg không chỉ là một lệnh duy nhất mà là hệ sinh thái gồm ba chương trình dòng lệnh bổ trợ nhau:
- ffmpeg — chương trình chính chuyển đổi định dạng âm thanh và video, đồng thời có thể thu và mã hóa theo thời gian thực từ các nguồn phần cứng hoặc phần mềm như card thu hình TV
- ffplay — trình phát media tối giản, xây dựng trên thư viện SDL và các thư viện của FFmpeg
- ffprobe — công cụ hiển thị thông tin media theo nhiều định dạng đầu ra: văn bản, CSV, XML, JSON
Các thư viện cốt lõi
Điểm mạnh lớn nhất của FFmpeg nằm ở thư viện, bởi phần lớn phần mềm phát media trên thế giới đều dùng chúng thay vì chỉ gọi lệnh CLI. Cụ thể:
| Thư viện | Chức năng |
|---|---|
| libavcodec | Tất cả bộ mã hóa và giải mã âm thanh/video gốc, phần lớn được viết từ đầu để tối ưu hiệu năng và tái sử dụng mã nguồn |
| libavformat (Lavf) | Bộ giải phân tích (demuxer) và gộp (muxer) cho các định dạng container |
| libavfilter | Thay thế cho vhook, cho phép lọc và biến đổi âm thanh/video giữa bước giải mã và mã hóa |
| libswscale | Thay đổi tỉ lệ kích thước hình ảnh và chuyển đổi không gian màu, định dạng pixel |
| libswresample | Các quy trình lấy mẫu lại (resampling) âm thanh |
| libavutil | Thư viện tiện ích chung: hàm băm, mã hóa, nén LZO, mã hóa Base64 |
| libavdevice | Thu và gửi âm thanh/video qua thiết bị nội bộ và bên ngoài |
Nhờ các thư viện này, VLC dùng FFmpeg làm lõi xử lý, và cả YouTube lẫn Bilibili cũng đã tích hợp FFmpeg vào quy trình xử lý cốt lõi. Nói cách khác, phần lớn video bạn xem trên web đã đi qua FFmpeg ít nhất một lần.

Lịch sử phát triển
Dự án bắt đầu bởi Fabrice Bellard (bút danh “Gérard Lantau”) vào năm 2000, và được Michael Niedermayer dẫn dắt từ năm 2004 đến 2015. Một số nhà phát triển FFmpeg cũng từng tham gia dự án MPlayer. Hai chữ “FF” trong tên FFmpeg là viết tắt của “fast forward” ( tua nhanh), còn biểu tượng dự án là một đường gấp khúc gợi hình cách các codec video MPEG xử lý mã hóa entropy.
Trong lịch sử, năm 2011 một nhóm nhà phát triển đã quyết định fork dự án sang tên Libav do bất đồng với ban lãnh đạo; nhánh Libav sau đó bị tuyên bố là đã bị bỏ hoang vào năm 2020. Tháng 1 năm 2014, hai nhân viên Google thông báo hơn 1000 lỗi đã được sửa trong FFmpeg chỉ trong hai năm nhờ kiểm thử fuzz tự động — minh chứng rõ giá trị của quy trình kiểm thử tự động với một dự án xử lý dữ liệu nhị phân phức tạp. Năm 2018, chương trình ffserver lâu đời bị gỡ bỏ hoàn toàn do chi phí bảo trì cao.
Dự án phát hành bản mới trung bình mỗi ba tháng một lần. Trong lịch sử phát triển codec, chính dự án FFmpeg đã tạo ra hai định dạng video là FFV1 (lossless) và Snow (lossless và lossy), cùng một định dạng container đa phương tiện tên NUT. Năm 2010, các nhà phát triển Fiona Glaser, Ronald Bultje và David Conrad công bố bộ giải mã ffvp8, và qua thử nghiệm xác nhận ffvp8 nhanh hơn chính libvpx của Google. Hiện đại hơn, FFmpeg đã bổ sung bộ giải mã VP9 gốc và OpenHEVC, vào phiên bản 4.1 vào tháng 11 năm 2018 hỗ trợ đóng gói AV1 trong MP4 và Matroska, bao gồm cả WebM.
Ví dụ sử dụng thực tế
Sức mạnh lớn nhất của FFmpeg nằm ở cú pháp ghép bộ lọc (filtergraph), cho phép nhiều thao tác xử lý nối tiếp trong một lệnh duy nhất. Một số ví dụ thường gặp:
- Chuyển đổi định dạng:
ffmpeg -i input.mkv output.mp4 - Cắt video chính xác theo thời gian:
ffmpeg -ss 00:00:30 -i input.mp4 -t 60 -c copy clip.mp4 - Ghép nhiều file video:
ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4 - Thay đổi kích thước và nén:
ffmpeg -i input.mp4 -vf "scale=1280:-2" -c:v libx264 -crf 23 output.mp4 - Trích xuất âm thanh:
ffmpeg -i input.mp4 -vn -acodec libmp3lame -q:a 2 output.mp3
Tham số -c copy đặc biệt đáng chú ý: nó chỉ đóng gói lại mà không mã hóa lại, nên tốc độ gần như tức thì và không làm suy giảm chất lượng. Ngược lại, tham số -crf (Chất lượng không yêu cầu) cho phép điều chỉnh cân bằng giữa kích thước tệp và chất lượng hình ảnh, giá trị thấp hơn là chất lượng tốt hơn.

Giấy phép và cách sử dụng an toàn
FFmpeg được phát hành theo giấy phép LGPL-2.1-or-later hoặc GPL-2.0-or-later, tùy thuộc vào các tùy chọn biên dịch được bật. Đây là chi tiết quan trọng nếu bạn định nhúng FFmpeg vào sản phẩm thương mại: bản build với các thành phần thuộc phạm vi GPL sẽ kéo toàn bộ sản phẩm của bạn vào nghĩa vụ GPL.
Vì FFmpeg giải mã các định dạng media phức tạp từ nguồn không tin cậy, bảo mật luôn là mối quan tâm hàng đầu. Chỉ nên xử lý tệp từ nguồn đáng tin cậy, cập nhật thường xuyên, và hạn chế dùng các bản build không rõ nguồn gốc. Bạn có thể tìm hiểu thêm tại trang chính thức ffmpeg.org, danh sách đầy đủ bộ lọc tại tài liệu bộ lọc FFmpeg, và bối cảnh dự án tại bài viết FFmpeg trên Wikipedia.
