Sơ đồ chuyển đổi M3U8 sang MP4

Tại sao M3U8 cần phải "chuyển đổi" thay vì lưu trực tiếp thành tệp?

Khi bạn đang phát một luồng trực tuyến M3U8, trình duyệt thực tế đang liên tục yêu cầu các gói dữ liệu .ts nối tiếp nhau, sau đó giải mã và phát tức thời. Các đoạn video này:

  • Định dạng là MPEG-2 Transport Stream (.ts).
  • Kích thước thường là 2-10 giây của video.
  • Không thể phát trực tiếp bằng hầu hết các trình phát thông dụng (định dạng không được hỗ trợ rộng rãi).

Để có một video có thể phát trên bất kỳ thiết bị nào, bạn cần:

  1. Tải xuống tất cả các đoạn .ts.
  2. Hợp nhất chúng theo đúng thứ tự.
  3. Đóng gói lại thành container .mp4 (tùy chọn: mã hóa lại để chuyển đổi định dạng mã hóa).

Cấu trúc hai tầng của M3U8

Trước khi bắt đầu tải xuống, bạn phải hiểu rằng M3U8 có thể có hai tầng:

Master Playlist (Danh sách phát chính)

#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=2800000,RESOLUTION=1280x720
720p/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1400000,RESOLUTION=854x480
480p/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=700000,RESOLUTION=640x360
360p/index.m3u8

Tệp này tự nó không chứa các đoạn video, mà chỉ liệt kê đường dẫn của các Media Playlist với các mức chất lượng khác nhau.

Media Playlist (Danh sách phát phương tiện)

#EXTM3U
#EXT-X-TARGETDURATION:6
#EXT-X-VERSION:3
#EXTINF:6.006,
segment-001.ts
#EXTINF:6.006,
segment-002.ts
...
#EXT-X-ENDLIST

Đây mới là danh sách thực sự chứa đường dẫn của các đoạn .ts.

Chi tiết phương pháp chuyển đổi

Cách 1: FFmpeg -c copy (Đóng gói lại trực tiếp, nhanh nhất)

ffmpeg -i "https://stream.example.com/720p/index.m3u8" \
       -c copy \
       -movflags +faststart \
       output.mp4

Giải thích: - -c copy: Không mã hóa lại, chỉ đóng gói lại dữ liệu H.264 + AAC của TS vào container MP4. - -movflags +faststart: Di chuyển moov atom lên đầu tệp, giúp MP4 hỗ trợ vừa tải vừa phát (thân thiện với phát trực tuyến). - Tốc độ cực nhanh, hầu như không tiêu tốn CPU, kích thước đầu ra gần như tương đương với kích thước gốc.

Cách 2: FFmpeg Mã hóa lại (Giảm kích thước)

ffmpeg -i "https://stream.example.com/720p/index.m3u8" \
       -c:v libx264 -crf 23 -preset medium \
       -c:a aac -b:a 128k \
       output.mp4

Giải thích: - Phù hợp khi cần nén tệp video có tốc độ bit (bitrate) cao ban đầu. - Giá trị CRF càng thấp thì chất lượng càng tốt, tệp càng lớn (khuyến nghị từ 18-28). - Tốc độ chậm hơn nhiều so với -c copy vì cần CPU để mã hóa lại.

Cách 3: FFmpeg.wasm trên trình duyệt (Không cần cài đặt)

Công cụ nghiên cứu HLS của trang web này thực hiện việc hợp nhất bằng FFmpeg.wasm ngay bên trong trình duyệt, tương đương với việc thực thi trong trình duyệt:

ffmpeg -f concat -safe 0 -i concat.txt -c copy output.mp4

Kịch bản áp dụng: Khi cần hợp nhất tạm thời một số ít liên kết công khai và không muốn cài đặt bất kỳ phần mềm nào.

So sánh công cụ chuyển đổi

Công cụ Yêu cầu cài đặt Tốc độ Hạn chế CORS Đối tượng phù hợp
Dòng lệnh FFmpeg ★★★★★ Có thể bỏ qua Nhà phát triển, người dùng kỹ thuật
VLC ★★★ Có thể bỏ qua Người dùng bình thường
Công cụ trình duyệt (Trang này) Không ★★★ Bị hạn chế Kiểm tra nhanh
Web chuyển đổi trực tuyến Không ★★ Đa số có hỗ trợ Người dùng không chuyên

Các câu hỏi thường gặp

Video sau khi chuyển đổi không có âm thanh?

Thông thường là do luồng âm thanh ở định dạng AC-3 (Dolby), một số trình phát MP4 không hỗ trợ. Giải pháp:

ffmpeg -i input.m3u8 -c:v copy -c:a aac output.mp4

Chỉ cần ép mã hóa lại âm thanh sang định dạng AAC là có thể giải quyết được.

Video không đồng bộ (Âm thanh và hình ảnh lệch nhau)?

Nếu âm thanh và hình ảnh không khớp, thường là do tem thời gian (timestamp) PTS/DTS của các đoạn TS bị nhảy. Thêm -async 1 hoặc sử dụng -fflags +genpts để tạo lại tem thời gian:

ffmpeg -fflags +genpts -i input.m3u8 -c copy output.mp4

M3U8 đã bị mã hóa thì phải làm sao?

Nếu trong M3U8 có chứa #EXT-X-KEY:METHOD=AES-128,URI=..., có nghĩa là các đoạn video đã được mã hóa. FFmpeg có thể tự động xử lý AES-128, nhưng DRM (như Widevine, FairPlay) là bảo vệ cấp độ phần cứng, hiện tại không có công cụ công khai nào có thể xử lý được.

Xem thêm chi tiết về mã hóa: Phân tích đầy đủ về mã hóa M3U8 và DRM

Tài nguyên liên quan

Sẵn sàng kiểm tra luồng M3U8 của bạn?

🚀 Thử trình phát M3U8 trực tuyến