Trước khi FFmpeg ra đời, việc làm việc với các tệp video và âm thanh đòi hỏi phải có nhiều phần mềm khác nhau cho từng định dạng và tác vụ riêng lẻ, như chuyển đổi định dạng hoặc trích xuất âm thanh từ video. Những công cụ này thường không miễn phí và thiếu tính linh hoạt.
FFmpeg ra đời vào năm 2000, do Fabrice Bellard phát triển, nhằm giải quyết những khó khăn trong việc xử lý video và âm thanh. Mục đích của FFmpeg là tạo ra một công cụ mã nguồn mở giúp chuyển đổi, mã hóa, và chỉnh sửa các tệp đa phương tiện, hỗ trợ nhiều định dạng mà không cần sử dụng phần mềm thương mại phức tạp.
1. FFmpeg là gì?
FFmpeg là một công cụ mã nguồn mở dùng để xử lý video, âm thanh và các tệp đa phương tiện khác (Streaming, Phụ đề, ...). FFmpeg cung cấp các công cụ mạnh mẽ giúp chuyển đổi định dạng, mã hóa, giải mã, ghép hoặc tách video và âm thanh một cách dễ dàng.
Nhờ hỗ trợ nhiều định dạng và tính năng, FFmpeg trở thành lựa chọn phổ biến cho các Developer trong việc chỉnh sửa video hoặc truyền phát nội dung trực tuyến. FFmpeg khá linh hoạt và có thể biên dịch, chạy trên nhiều hệ điều hành như Linux, Mac OS X, Windows và nhiều kiến trúc máy khác nhau.
2. Các tính năng chính của FFmpeg
- Giải mã và mã hóa: Hỗ trợ nhiều định dạng video, âm thanh và hình ảnh, từ những định dạng phổ biến như MP4, MP3, AAC, H.264 đến các định dạng cũ.
- Chuyển đổi định dạng (Transcode): Dễ dàng chuyển đổi giữa các định dạng âm thanh và video khác nhau, như từ MOV sang MP4, từ WAV sang MP3, v.v.
- Truyền tải (Streaming): FFmpeg có thể tạo và nhận luồng truyền tải trực tiếp (live streaming) qua các giao thức như RTMP, HLS.
- Ghép và tách (Mux/Demux): Kết hợp hoặc tách video và âm thanh từ các tệp đa phương tiện.
- Áp Bộ lọc (Filters): Áp dụng các bộ lọc để thay đổi video và âm thanh, ví dụ như thay đổi kích thước, cắt ghép, xoay video, thêm phụ đề, hoặc điều chỉnh âm lượng.
- Xử lý hàng loạt (Batch processing): Có thể xử lý nhiều tệp một cách tự động nhờ vào các lệnh shell script.
- Tạo thumbnail và trích xuất ảnh từ video: Dễ dàng lấy khung hình từ video để làm ảnh thumbnail hoặc tạo ảnh động.
3. Ứng dụng của FFmpeg trong các lĩnh vực
FFmpeg đóng vai trò quan trọng trong video streaming, đặc biệt là live streaming. Nhờ khả năng mã hóa và chuyển đổi định dạng linh hoạt, FFmpeg giúp xử lý và truyền tải video hiệu quả trên nhiều nền tảng và giao thức khác nhau, đồng thời còn được ứng dụng trong nhiều tác vụ xử lý video và âm thanh khác.
Khi bạn tải lên một video trên TikTok, FFmpeg sẽ tự động chuyển đổi video của bạn sang các định dạng và kích thước phù hợp để đảm bảo nó phù hợp trên nhiều thiết bị khác nhau, từ điện thoại di động đến máy tính bảng. TikTok cũng sử dụng FFmpeg để nén video, giúp video tải nhanh hơn mà không làm giảm đáng kể chất lượng.
- Điện thoại có màn hình nhỏ: FFmpeg chuyển đổi video thành độ phân giải thấp hơn (ví dụ 720p hoặc 480p) để video không bị giật, tải nhanh hơn và không tiêu tốn quá nhiều dữ liệu di động.
- Máy tính bảng hoặc TV: FFmpeg giữ video ở độ phân giải cao hơn (như 1080p hoặc 4K), đảm bảo chất lượng hình ảnh sắc nét trên màn hình lớn.
Khi bạn xem một buổi livestream trên Twitch hay Youtube, FFmpeg sẽ giúp chuyển đổi luồng video của streamer thành nhiều độ phân giải khác nhau, như 480p, 720p, và 1080p. Nếu bạn có kết nối mạng yếu, Twitch sẽ tự động chuyển video xuống độ phân giải thấp hơn, như 480p, để tránh giật lag. Ngược lại, nếu bạn có mạng nhanh, bạn có thể xem livestream với độ phân giải cao hơn, như 1080p, mà vẫn đảm bảo trải nghiệm mượt mà.
Tương tự, khi bạn nghe nhạc trên Spotify, FFmpeg sẽ giúp chuyển đổi âm thanh thành các chất lượng khác nhau. Nếu bạn sử dụng kết nối 3G hoặc mạng chậm, Spotify sẽ phát ở chất lượng âm thanh thấp hơn để tiết kiệm băng thông và đảm bảo không bị gián đoạn. Nhưng khi mạng nhanh hơn, bạn sẽ nghe nhạc ở chất lượng cao hơn với âm thanh rõ nét hơn.
4. Giới thiệu về HLS (HTTP Live Streaming)
4.1 HLS là gì?
HLS (HTTP Live Streaming) là một giao thức truyền tải media dựa trên HTTP được phát triển bởi Apple. Nó cho phép truyền tải các nội dung video và âm thanh qua mạng internet bằng cách chia nhỏ chúng thành các đoạn (segment) nhỏ và phân phối thông qua các file playlist có định dạng M3U8. HLS được thiết kế để hỗ trợ cả streaming trực tiếp (live) và theo yêu cầu (on-demand).
4.2 Ưu điểm của HLS trong video streaming
- Thích ứng với băng thông mạng (Adaptive Bitrate Streaming): HLS hỗ trợ nhiều phiên bản của cùng một nội dung với các chất lượng khác nhau. Trình phát có thể tự động chọn phiên bản phù hợp nhất dựa trên tốc độ kết nối internet của người dùng, đảm bảo trải nghiệm mượt mà mà không bị gián đoạn.
- Phân phối qua HTTP: Sử dụng giao thức HTTP phổ biến, HLS dễ dàng tương thích với các hạ tầng mạng hiện có như máy chủ web, CDN (Content Delivery Network), giúp giảm chi phí và phức tạp trong việc triển khai.
- Tương thích đa nền tảng: HLS được hỗ trợ rộng rãi trên nhiều thiết bị và hệ điều hành, bao gồm iOS, macOS, Android (qua các thư viện hỗ trợ), và hầu hết các trình duyệt web hiện đại.
- An toàn và bảo mật: HLS hỗ trợ mã hóa nội dung và cơ chế bảo vệ bằng khóa, giúp bảo vệ bản quyền và ngăn chặn truy cập trái phép.
4.3 Cấu trúc của HLS
Trong phần "HLS là gì?" mình đã giải thích một cách ngắn gọn về HLS và trong đó cũng có mình cũng đề cập tới 2 từ khoá segment và playlist. Ở phần này mình sẽ nói rõ hơn về chúng.
4.3.1 Playlist (Danh sách phát)
Playlist là tệp văn bản (định dạng .m3u8
) chứa danh sách các tệp phân đoạn (segments) và thông tin siêu dữ liệu khác. Playlist thường được phân thành hai loại:
- Master Playlist (Danh sách phát chính): Đây là tệp danh sách chính chứa các liên kết đến các phiên bản khác nhau của video với độ phân giải, bitrate khác nhau. Khách hàng sẽ chọn phiên bản phù hợp dựa trên băng thông và thiết bị.
- Media Playlist (Danh sách phát phương tiện): Tệp này chứa các đường dẫn đến từng phân đoạn video cụ thể.
Trong media playlist:
- #EXT-X-TARGETDURATION: Độ dài tối đa (tính theo giây) của một phân đoạn.
- #EXT-X-VERSION: Phiên bản của HLS được sử dụng.
- #EXTINF: Độ dài (theo giây) của phân đoạn tương ứng.
- segment_0.ts: Phân đoạn video đầu tiên trong tệp
.ts
. - #EXT-X-ENDLIST: Cho biết rằng danh sách phát đã kết thúc.
Trong master playlist:
- #EXTM3U: Khai báo tệp này là playlist HLS.
- #EXT-X-STREAM-INF: Cung cấp thông tin về băng thông và độ phân giải cho mỗi phiên bản video.
- Mỗi dòng tiếp theo là đường dẫn đến Media Playlist tương ứng cho từng độ phân giải/băng thông.
4.3.2 TS segment là gì?
- TS segment là các đoạn video nhỏ được cắt ra từ video gốc, có định dạng
.ts
(MPEG Transport Stream). - Mỗi segment thường có độ dài từ 2 đến 10 giây, tùy thuộc vào cấu hình.
- Các segment này cho phép trình phát tải và phát video theo từng phần nhỏ, giúp giảm thiểu thời gian chờ đợi và tối ưu hóa việc sử dụng băng thông.
Cách HLS phân phối video qua các segment
Quy trình hoạt động:
- Máy chủ chia video thành các segment
.ts
và tạo file playlist.m3u8
. - Trình phát tải file playlist và đọc danh sách các segment.
- Trình phát bắt đầu tải các segment theo thứ tự và phát cho người dùng.
- Nếu sử dụng Adaptive Bitrate, trình phát có thể chuyển đổi giữa các playlist có chất lượng khác nhau dựa trên băng thông hiện tại.
Ưu điểm của việc sử dụng segment:
- Tải nhanh hơn: Người dùng không cần tải toàn bộ video mới có thể xem.
- Khả năng thích ứng: Dễ dàng chuyển đổi giữa các chất lượng video mà không gây gián đoạn.
- Khả năng phục hồi lỗi: Nếu một segment bị lỗi, trình phát có thể bỏ qua và tiếp tục với segment tiếp theo.
5. Cài đặt FFmpeg
5.1 Hệ điều hành Windows
Bước 1: Tải xuống FFmpeg:
- Truy cập trang web https://ffmpeg.org/download.html.
- Chọn mục Windows Builds từ các nhà cung cấp như Gyan.dev hoặc BtbN.
- Tải xuống phiên bản "ffmpeg-release-full" để đảm bảo có đầy đủ các codec.
Bước 2: Giải nén và cài đặt:
- Giải nén file tải về vào một thư mục, ví dụ
C:\ffmpeg
. - Thêm đường dẫn
C:\ffmpeg\bin
vào biến môi trườngPath
: - Mở Control Panel > System > Advanced system settings.
- Chọn Environment Variables.
- Trong System variables, tìm và chọn Path, sau đó nhấn Edit.
- Nhấn New và nhập
C:\ffmpeg\bin
, sau đó nhấn OK để lưu.
5.2 Hệ điều hành masOS
Cách 1: Sử dụng Homebrew (khuyến nghị):
- Mở Terminal.
- Cài đặt Homebrew (nếu chưa có):
Link lấy script : Homebrew dowload
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
- Cài đặt FFmpeg:
brew install ffmpeg
Cách 2: Cài đặt từ nguồn:
- Tải xuống mã nguồn từ https://ffmpeg.org/download.html.
- Làm theo hướng dẫn biên dịch trên trang web.
5.3 Hệ điều hành Linux
5.3.1 Ubuntu/Debian:
sudo apt update
sudo apt install ffmpeg
5.3.2 CentOS/Fedora:
sudo dnf install ffmpeg
Kiểm tra phiên bản và xác nhận cài đặt thành công
Sau khi cài đặt, mở Terminal (hoặc Command Prompt trên Windows) và nhập:
ffmpeg -version
Nếu FFmpeg được cài đặt thành công, bạn sẽ thấy thông tin về phiên bản FFmpeg và các cấu hình được hỗ trợ.
6. Kiểm tra thông tin video
6.1 Định dạng video hỗ trợ
FFmpeg hỗ trợ hầu hết các định dạng video và âm thanh phổ biến, bao gồm:
- Video: MP4, MOV, AVI, MKV, FLV, WMV, MPEG, v.v.
- Audio: MP3, AAC, WAV, FLAC, OGG, v.v.
- Codec: H.264, H.265 (HEVC), VP8, VP9, MPEG-2, AAC, MP3, AC3, v.v.
6.2 Kiểm tra chất lượng và độ phân giải của video
Trước khi tiến hành encode, bạn nên kiểm tra thông tin của video nguồn để đảm bảo nó phù hợp:
Kiểm tra thông tin video:
Sử dụng lệnh sau để xem thông tin chi tiết:
ffprobe -i input_video.mp4
Câu lệnh trên cho phép xác định các thông tin :
1. Độ phân giải và tỷ lệ khung hình.
- Độ phân giải phổ biến: 1920x1080 (Full HD), 1280x720 (HD), 854x480 (SD).
- Tỷ lệ khung hình (frame rate): 24fps, 30fps, 60fps.
2. Kiểm tra chất lượng video:
- Bitrate: Xác định chất lượng video, thường được đo bằng kbps hoặc Mbps.
- Codec sử dụng: Đảm bảo codec tương thích với quá trình encode HLS.
3. Kiểm tra độ dài và kích thước file:
Đảm bảo thời lượng video (duration) không quá dài hoặc quá lớn gây khó khăn trong quá trình xử lý.
7. Hướng dẫn encode video thành HLS với FFmpeg
7.1 Lệnh cơ bản để tạo HLS từ một video đầu vào
ffmpeg -i input_video.mp4 \
-c:v libx264 -b:v 1500k -vf "scale=1280:720,setsar=1" -c:a aac -b:a 128k \
-hls_time 4 -hls_list_size 0 -hls_segment_filename "segment_%d.ts" \
playlist.m3u8
Giải thích các tham số:
-i input.mp4
: Video nguồn.-c:v libx264
: bộ mã hóa H.264 được sử dụng phổ biến cho video.-vf
: Tùy chọn áp dụng bộ lọc video.scale=1280:720
: Thiết lập độ phân giải cho video là 1280x720 (HD).setsar=1
: Đặt tỷ lệ khung hình mẫu (Sample Aspect Ratio - SAR) thành 1:1, đảm bảo tỷ lệ hiển thị chính xác.-start_number 0
: Bắt đầu đánh số segment từ 0.-c:a aac
: bộ mã hóa âm thanh phổ biến và hiệu quả.acc
: bộ mã hoá được hỗ trợ rộng rãi trong các trình phát video trực tuyến.-b:a
: bitrate âm thanh, quy định tốc độ dữ liệu cho âm thanh.128k
là bitrate âm thanh phổ biến, cung cấp chất lượng âm thanh tốt mà không tiêu tốn quá nhiều băng thông.-hls_time 4
: Mỗi segment có độ dài 10 giây.-hls_list_size 0
: Danh sách playlist chứa tất cả segment.-f hls
: Định dạng output là HLS.index.m3u8
: Tên file playlist đầu ra.
7.2 Tạo HLS với Adaptive Bitrate Streaming
FFmpeg giúp thực hiện việc tạo video streaming HLS với bitrate thích ứng (Adaptive Bitrate Streaming). Nó chuyển đổi một video đầu vào thành ba phiên bản với độ phân giải và bitrate khác nhau, sau đó đóng gói chúng vào định dạng HLS để streaming.
ffmpeg -i input_video.mp4 \
-filter_complex \
"[0:v]split=3[v1][v2][v3]; \
[v1]scale=w=2560:h=1440:force_original_aspect_ratio=decrease[v1out]; \
[v2]scale=w=1920:h=1080:force_original_aspect_ratio=decrease[v2out]; \
[v3]scale=w=1280:h=720:force_original_aspect_ratio=decrease[v3out]" \
-map "[v1out]" -map 0:a -c:v:0 libx264 -profile:v:0 main -crf 20 -sc_threshold 0 -g 48 -keyint_min 48 \
-b:v:0 3200k -maxrate:v:0 2996k -bufsize:v:0 4200k \
-map "[v2out]" -map 0:a -c:v:1 libx264 -profile:v:1 main -crf 20 -sc_threshold 0 -g 48 -keyint_min 48 \
-b:v:1 2500k -maxrate:v:1 1498k -bufsize:v:1 2100k \
-map "[v3out]" -map 0:a -c:v:2 libx264 -profile:v:2 baseline -crf 20 -sc_threshold 0 -g 48 -keyint_min 48 \
-b:v:2 1500k -maxrate:v:2 665k -bufsize:v:2 1000k \
-c:a aac -b:a 128k \
-f hls \
-var_stream_map "v:0,a:0 v:1,a:1 v:2,a:2" \
-master_pl_name master.m3u8 \
-hls_time 6 \
-hls_list_size 0 \
-hls_segment_filename "v%v/segment%d.ts" \
"v%v/playlist.m3u8"
- Filter_complex và split video: Chia video thành ba luồng để áp dụng các độ phân giải khác nhau.
- Scale filter: Thay đổi độ phân giải cho từng luồng video.
- Map và thiết lập codec, bitrate cho từng luồng.
- Var_stream_map: Định nghĩa mapping giữa video và audio cho từng phiên bản.
- Output playlist: Tạo các playlist và segment cho từng phiên bản.
Kết quả đầu ra của từng độ phân giải sẽ nằm lần lược trong các folder v0, v1, v2 tương ứng với 2560x1440, 1920x1080, 1280x720.
7.3 Hướng dẫn phát HLS với VideoJs, VLC Media Player.
7.3.1 VLC Media Player
Sau khi đã có được bản encode của từng độ phân giải khác nhau. Các bạn có thể chạy file m3u8 để test chất lượng đầu ra bằng cách download VLC media player.
7.3.2 VideoJs
Đây là github của video.js các bạn có thể clone source về và phát m3u8 bằng cách thêm link m3u8 của các bạn vào <source />
.
Ví dụ:
<source src="file-name.m3u8" type="application/x-mpegURL" />
- Lưu ý về định dạng: Đảm bảo rằng bạn sử dụng
type="application/x-mpegURL"
để trình duyệt nhận diện đúng định dạng HLS.
Kết luận
Trong bài viết này, chúng ta đã khám phá FFmpeg—một công cụ mạnh mẽ cho xử lý đa phương tiện. Bắt đầu từ việc hiểu FFmpeg là gì và các tính năng chính của nó, chúng ta thấy được tầm quan trọng của FFmpeg trong nhiều lĩnh vực.
Chúng ta cũng đã tìm hiểu về HLS (HTTP Live Streaming) và cách FFmpeg hỗ trợ tạo luồng HLS. Qua các bước cài đặt FFmpeg, kiểm tra thông tin video, và cuối cùng là hướng dẫn encode video thành HLS với FFmpeg, bạn đã nắm được quy trình cơ bản để chuyển đổi video thành luồng streaming hiệu quả.
Các bài viết liên quan:
Bài viết liên quan
Hướng dẫn tích hợp Redux và React Query trong dự án React Vite
Nov 22, 2024 • 8 min read
Giới thiệu Kiến trúc Backend for Frontend (BFF)
Nov 16, 2024 • 10 min read
Flask là gì? Hướng dẫn tạo Ứng dụng Web với Flask
Nov 15, 2024 • 7 min read
Webhook là gì? So sánh Webhook và API
Nov 15, 2024 • 8 min read
Spring Boot là gì? Hướng dẫn Khởi tạo Project Spring Boot với Docker
Nov 14, 2024 • 6 min read
Two-Factor Authentication (2FA) là gì? Vì sao chỉ Mật khẩu thôi là chưa đủ?
Nov 13, 2024 • 7 min read