Danh sách phát M3U và M3U8
M3U là định dạng danh sách phát IPTV phổ biến nhất: một tệp văn bản thuần, mỗi kênh gồm một dòng mô tả và một dòng đường dẫn. Trang này trình bày cú pháp đầy đủ mà TS IPTV đọc được, kể cả các thuộc tính kiểu Kodi.
TS IPTV không có sẵn kênh nào. Ứng dụng chỉ phát các danh sách phát do bạn thêm vào. Mọi ví dụ dùng tên miền giả example.com, một luồng thử nghiệm công khai, hoặc tệp ví dụ của chính TS IPTV trên tsiptv-8bdd6.web.app.
M3U là gì
M3U ra đời cùng các trình nghe nhạc WinPlay3 và Winamp như một danh sách đường dẫn tới tệp media, mỗi dòng một đường dẫn. Cộng đồng IPTV mở rộng nó thành danh sách kênh: mỗi kênh có tên, logo, nhóm và mã để khớp với lịch phát sóng. Phần mở rộng này là quy ước chung, không phải một tiêu chuẩn chính thức.
| Tên gọi | Nghĩa là gì |
|---|---|
| M3U | Danh sách đường dẫn thuần, mỗi dòng một mục, không có thông tin kèm theo. |
| M3U mở rộng | Dòng đầu là #EXTM3U, và mỗi mục có một dòng #EXTINF đứng trước. |
| M3U8 | Cùng định dạng đó, nhưng mã hoá UTF-8. Phần mở rộng .m3u8 báo hiệu UTF-8. |
Danh sách HLS khác danh sách kênh IPTV
Luồng HLS cũng dùng tệp .m3u8 bắt đầu bằng #EXTM3U (RFC 8216), nhưng đó là chỉ mục của một luồng, không phải danh sách kênh:
| Danh sách media HLS | Danh sách kênh IPTV | |
|---|---|---|
| Mỗi mục là | một đoạn video 2–10 giây của một luồng | một kênh (đường dẫn tới luồng của kênh đó) |
#EXTINF:<n> | thời lượng đoạn, tính bằng giây | -1 hoặc 0 (bỏ qua) |
| Thẻ đặc trưng | #EXT-X-TARGETDURATION, #EXT-X-MEDIA-SEQUENCE, #EXT-X-STREAM-INF | chỉ #EXTM3U |
Thuộc tính trên #EXTINF | không có | tvg-id="…", group-title="…" và các thuộc tính khác |
| Ai mở nó | trình phát video, tự động | bạn, khi thêm danh sách phát |
Nếu bạn dán đường dẫn của một luồng HLS vào TS IPTV, ứng dụng nhận ra điều đó và hỏi “Đây là một luồng đơn”: chọn Thêm thành kênh để tạo một danh sách phát có đúng một kênh.
Cú pháp
#EXTM3U [thuộc tính tiêu đề]
#EXTINF:-1 [khoá="giá trị" ...],<Tên kênh>
[#EXTGRP:<nhóm>]
[#EXTVLCOPT:<tuỳ chọn>=<giá trị>]
[#KODIPROP:<thuộc tính>=<giá trị>]
<đường dẫn luồng>[|Header=Giá trị&Header=Giá trị]
Dòng đầu tiên là #EXTM3U. Mỗi kênh bắt đầu bằng một dòng #EXTINF, có thể có vài dòng tuỳ chọn, và kết thúc bằng dòng đường dẫn. Phần trong ngoặc vuông là không bắt buộc. Các dòng bắt đầu bằng # mà không phải thẻ đã biết được coi là chú thích.
Thuộc tính trên dòng #EXTM3U
| Thuộc tính | Nghĩa |
|---|---|
x-tvg-url | Đường dẫn lịch phát sóng XMLTV. Có thể ghi nhiều đường dẫn, cách nhau bằng dấu phẩy; TS IPTV tải tất cả (tối đa 5) và gộp lại. |
url-tvg | Tên cũ của x-tvg-url. Chỉ được đọc khi không có x-tvg-url. |
tvg-shift | Độ lệch giờ mặc định của lịch phát sóng, tính bằng giờ (ví dụ +2, -4.5), cho các kênh không tự khai báo. |
catchup, catchup-days, catchup-source, catchup-correction | Giá trị xem lại mặc định cho các kênh không tự khai báo. Xem xem lại trong hướng dẫn Kodi. |
Thuộc tính trên dòng #EXTINF
Mỗi thuộc tính có dạng khoá="giá trị", giá trị nằm trong dấu nháy kép thẳng. Tên thuộc tính không phân biệt hoa thường (tvg-ID được hiểu là tvg-id). Tất cả thuộc tính đứng trước dấu phẩy; tên kênh đứng sau.
| Thuộc tính | Bắt buộc | Nghĩa |
|---|---|---|
| (tên sau dấu phẩy) | có | Tên hiển thị của kênh. Đó là phần chữ sau dấu phẩy đầu tiên nằm ngoài dấu nháy, nên tên có thể chứa dấu phẩy. |
tvg-id | nên có | Mã để khớp kênh với <channel id> trong lịch XMLTV. Thường có dạng TenKenh.ma-quoc-gia, ví dụ ExampleNews.us. |
tvg-name | không | Tên phụ, chỉ dùng để khớp với lịch phát sóng; không thay tên hiển thị. |
tvg-logo | không | Đường dẫn ảnh logo (PNG, JPG hoặc SVG). |
group-title | không | Nhóm của kênh. Nhiều nhóm cách nhau bằng dấu chấm phẩy: group-title="News;HD" đặt kênh vào cả hai nhóm. |
tvg-chno (hoặc ch-number) | không | Số kênh, là số nguyên. Hiển thị trước tên kênh. |
tvg-shift | không | Độ lệch giờ lịch phát sóng riêng cho kênh này, tính bằng giờ. |
radio | không | "true" đánh dấu kênh radio: có biểu tượng radio và trình phát hiện logo thay cho khung video. |
media | không | "true" đánh dấu một video theo yêu cầu thay vì kênh trực tiếp. |
catchup, catchup-days, catchup-source, catchup-correction | không | Thông tin xem lại (catch-up). Được lưu lại; tính năng phát lại chương trình cũ sẽ có sau. |
user-agent, referrer | không chuẩn | Một số công cụ ghi header ở dạng thuộc tính. TS IPTV vẫn đọc, nhưng nên dùng #EXTVLCOPT hoặc hậu tố | bên dưới. |
#EXTGRP
#EXTGRP:Tên nhóm là một cách khác để đặt nhóm, và có hai cách dùng:
- Trong một kênh (sau
#EXTINF, trước đường dẫn): áp dụng cho kênh đó nếu nó không cógroup-title. - Trước các kênh: trở thành nhóm mặc định cho mọi kênh phía sau không có
group-title, cho tới một dòng#EXTGRP:để trống hoặc hết tệp.
#EXTVLCOPT
| Dòng | Nghĩa |
|---|---|
#EXTVLCOPT:http-user-agent=… | Header User-Agent cho luồng này. |
#EXTVLCOPT:http-referrer=… | Header Referer cho luồng này (chú ý cách viết referrer có hai chữ r; http-referer cũng được chấp nhận). |
| khoá khác | Được lưu lại nhưng không có tác dụng. |
Header sau dấu |
Bạn có thể gắn header HTTP ngay sau đường dẫn, theo kiểu Kodi: https://cdn.example.com/live.m3u8|User-Agent=Mozilla%2F5.0&Referer=https%3A%2F%2Fexample.com%2F.
- TS IPTV tách ở dấu
|đầu tiên: phần trước là đường dẫn luồng, phần sau là các cặpTên=Giá trịnối bằng&. - Hãy mã hoá URL các giá trị (
/thành%2F,:thành%3A, dấu cách thành%20). Giá trị chưa mã hoá vẫn được chấp nhận nếu không chứa&. - Khi cùng một header được khai báo ở nhiều nơi, thứ tự ưu tiên là: hậu tố
|, rồi#EXTVLCOPT, rồi#KODIPROP, rồi thuộc tính không chuẩn.
#KODIPROP
Các dòng #KODIPROP:khoá=giá trị đến từ Kodi. Chúng khai báo loại luồng (mimetype), header và DRM (Widevine, PlayReady, ClearKey). Chi tiết từng khoá và nền tảng hỗ trợ có trong hướng dẫn định dạng Kodi.
Ví dụ đầy đủ
Tệp dưới đây là tệp ví dụ của TS IPTV. Kênh đầu tiên phát thật (luồng thử nghiệm công khai của Mux, phim Big Buck Bunny © Blender Foundation, giấy phép CC BY 3.0); các kênh còn lại dùng đường dẫn giả example.com để minh hoạ cú pháp.
#EXTM3U x-tvg-url="https://tsiptv-8bdd6.web.app/examples/guide.xml"
#EXTINF:-1 tvg-id="HlsTest.example" tvg-chno="1" group-title="Test",HLS Test Channel
https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8
#EXTINF:-1 tvg-id="ExampleNews.us" tvg-chno="2" tvg-logo="https://example.com/logos/news.png" group-title="News;HD",Example News
#EXTVLCOPT:http-user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64)
#EXTVLCOPT:http-referrer=https://example.com/
https://cdn.example.com/news/index.m3u8
#EXTINF:-1 tvg-id="ExampleSports.us" tvg-chno="3" group-title="Sports",Example Sports
https://cdn.example.com/sports/index.m3u8|Referer=https%3A%2F%2Fexample.com%2F
#EXTINF:-1 tvg-id="ExampleRadio.us" tvg-chno="4" radio="true" group-title="Radio",Example Radio
https://cdn.example.com/radio/stream.aac
#EXTINF:-1 tvg-id="ExampleProtected.us" tvg-chno="5" group-title="DRM demo",Example Protected
#KODIPROP:inputstream.adaptive.license_type=com.widevine.alpha
#KODIPROP:inputstream.adaptive.license_key=https://license.example.com/widevine|Content-Type=application%2Foctet-stream|R{SSM}|R
#KODIPROP:mimetype=application/dash+xml
https://cdn.example.com/protected/manifest.mpd
#EXTINF:-1 tvg-id="ExampleArchive.us" tvg-chno="6" catchup="shift" catchup-days="3" group-title="Archive",Example Archive
https://cdn.example.com/archive/index.m3u8
Giải thích từng phần:
- Dòng 1: tiêu đề
#EXTM3U, vớix-tvg-urltrỏ tới lịch phát sóng XMLTV ví dụ. - HLS Test Channel: kênh đơn giản nhất: một dòng
#EXTINFvới mã, số kênh và nhóm, rồi đến đường dẫn. - Example News: thuộc hai nhóm (
News;HD), có logo, và gửiUser-AgentcùngRefererqua hai dòng#EXTVLCOPT. - Example Sports: gửi
Refererbằng hậu tố|, giá trị đã được mã hoá URL. - Example Radio:
radio="true"đánh dấu kênh radio. - Example Protected: luồng DASH có DRM Widevine, khai báo bằng ba dòng
#KODIPROP(xem hướng dẫn Kodi). - Example Archive: khai báo xem lại kiểu
shifttrong 3 ngày.
Danh sách phát nhỏ nhất hợp lệ chỉ có ba dòng:
#EXTM3U
#EXTINF:-1,Kênh của tôi
https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8
Nếu bạn chỉ có một luồng và muốn lưu nó thành tệp, bạn cũng có thể dùng tệp .strm: xem tệp .strm trong hướng dẫn Kodi.
Tự viết một tệp
- Mở một trình soạn thảo văn bản thuần: Notepad (Windows), TextEdit ở chế độ văn bản thuần (macOS) hoặc VS Code. Đừng dùng Word hay Google Docs.
- Gõ
#EXTM3Uở dòng đầu tiên. - Với mỗi kênh, thêm hai dòng:
#EXTINF:-1 <thuộc tính>,<Tên>rồi đến đường dẫn luồng. - Dùng dấu nháy kép thẳng
"quanh giá trị thuộc tính, không dùng nháy cong“ ”. - Lưu với mã hoá UTF-8 (trong Notepad: Lưu thành › Mã hoá: UTF-8; tốt nhất là UTF-8 không có BOM), đuôi tệp
.m3uhoặc.m3u8. - Thử từng đường dẫn luồng trước khi chia sẻ, ví dụ trong VLC: Media › Open Network Stream.
Đưa tệp lên mạng
Mọi đường dẫn trả về chính nội dung tệp đều dùng được. Máy chủ có thể gửi Content-Type là audio/x-mpegurl, application/vnd.apple.mpegurl hay text/plain; TS IPTV tự nhận dạng nội dung.
| Cách | Dạng đường dẫn |
|---|---|
| GitHub (tệp gốc) | https://raw.githubusercontent.com/<user>/<repo>/<branch>/playlist.m3u |
| GitHub Pages | https://<user>.github.io/<repo>/playlist.m3u |
| Máy chủ tĩnh bất kỳ (Netlify, Cloudflare Pages, nginx của bạn…) | https://www.example.com/playlist.m3u |
| Dropbox | Đổi dl=0 ở cuối đường dẫn chia sẻ thành dl=1 để nhận tệp thay vì trang xem trước. |
| Tệp trên máy | Không cần đưa lên mạng: dùng Nhập từ tệp trong TS IPTV. |
Không dùng được: trang chia sẻ của Google Drive hay OneDrive, trang xem trước của Dropbox (dl=0), và đường dẫn GitHub dạng github.com/<user>/<repo>/blob/…. Chúng trả về một trang web, không phải tệp. Hãy dùng đường dẫn tệp gốc (Raw) hoặc đường dẫn tải trực tiếp.
- HTTPS được khuyến nghị. TS IPTV vẫn mở được
http://, nhưng khi đó bất kỳ ai trên cùng mạng đều có thể đọc hoặc sửa tệp trên đường truyền. - CORS: TS IPTV là ứng dụng cài đặt, không cần header CORS. Chỉ thêm
Access-Control-Allow-Origin: *nếu bạn muốn trình phát chạy trên web cũng đọc được tệp. - Danh sách phát từ đường dẫn được tải lại khi làm mới. Hãy giữ nguyên đường dẫn và sửa tệp tại chỗ.
Thêm vào TS IPTV
Trên điện thoại, máy tính bảng và máy tính
- Mở Thêm nguồn IPTV (nút Thêm IPTV trên màn hình chính).
- Nhập Tên nguồn, ví dụ “Kênh của tôi”.
- Dán đường dẫn vào Liên kết nguồn rồi chọn Thêm IPTV. Hoặc chọn Nhập từ tệp và chọn tệp
.m3u/.m3u8trên máy (tối đa 20 MB). - Khi nhập xong, TS IPTV cho biết số kênh tìm thấy. Nếu có mục bị bỏ qua, bạn thấy thêm dòng “Không thể nhập N mục” và nút Chi tiết liệt kê lý do: cần tiện ích Kodi (
plugin://), lấy luồng từ trang web, hoặc không có đường dẫn luồng.
Trên Android TV
- Mở hộp thoại nhập danh sách phát, dùng các phím mũi tên để chuyển giữa tên, đường dẫn và nút thêm.
- Nhập đường dẫn bằng bàn phím trên màn hình (hoặc bàn phím trên điện thoại nếu TV hỗ trợ).
- Nhập từ tệp chỉ xuất hiện nếu TV có trình chọn tệp; phần lớn TV không có, nên hãy dùng đường dẫn.
Danh sách phát nhập từ tệp không tự làm mới: hãy nhập lại tệp khi bạn sửa nó.
Lỗi thường gặp
| Lỗi | Biểu hiện | Cách sửa |
|---|---|---|
Đầu tệp không phải #EXTM3U hay #EXTINF (ví dụ một trang HTML hoặc chữ khác) | Không nhận ra danh sách phát | Đặt #EXTM3U ở ngay đầu tệp. |
Đường dẫn là một trang web (trang chia sẻ, blob/ của GitHub) | “Đường dẫn này mở một trang web, không phải danh sách phát” | Dùng đường dẫn tệp gốc (raw) hoặc tải trực tiếp. |
Nháy cong “ ” do trình soạn thảo văn bản tự đổi | Mất logo, mất nhóm | Gõ lại thành nháy thẳng ". |
| Không có dấu phẩy trước tên, hoặc thuộc tính đặt sau tên | Tên hiện ra như tvg-id="…", hoặc không có tên | Viết #EXTINF:-1 thuộc tính,Tên; sau tên không còn gì. |
Đường dẫn nằm cùng dòng với #EXTINF | Kênh không có luồng | Đường dẫn phải nằm trên dòng riêng. |
Dấu cách hoặc | trong đường dẫn chưa được mã hoá | Lỗi 404 hoặc 400 | Mã hoá dấu cách thành %20; chỉ dùng | cho phần header. |
Header viết thành thuộc tính (user-agent="…") | Máy chủ vẫn từ chối trên một số trình phát | Dùng #EXTVLCOPT:http-user-agent=… hoặc hậu tố |User-Agent=…. |
| Lưu bằng ANSI/Windows-1252 khi tên có dấu | Tên bị lỗi font (é) | Lưu lại bằng UTF-8. |
tvg-id không trùng với <channel id> nào trong XMLTV | Không có lịch phát sóng | Chép mã y hệt, phân biệt hoa thường. |
| Nhập một luồng HLS như danh sách kênh | Hàng trăm “kênh” mang tên số đoạn | Chọn Thêm thành kênh trong hộp thoại luồng đơn, hoặc nhập danh sách kênh thật. |
Đường dẫn có mã tạm thời (?token=…) | Hôm nay chạy, mai hỏng | Mã này hết hạn theo thiết kế; hãy lấy danh sách mới từ nhà cung cấp. |
Mục plugin://… | Bị bỏ qua, ghi trong chi tiết nhập | Đây là tiện ích Kodi, không phải luồng; TS IPTV không chạy được. Xem hướng dẫn Kodi. |
TS IPTV hỗ trợ những gì
| Tính năng | Android | iOS | Máy tính |
|---|---|---|---|
| M3U, M3U mở rộng, M3U8, tệp nén gzip | Hỗ trợ | Hỗ trợ | Hỗ trợ |
Nhiều nhóm, #EXTGRP, số kênh, kênh radio | Hỗ trợ | Hỗ trợ | Hỗ trợ |
Nhiều lịch phát sóng trong x-tvg-url, tvg-shift | Hỗ trợ | Hỗ trợ | Hỗ trợ |
Header theo kênh (#EXTVLCOPT, |, #KODIPROP) | Mọi header | Cố gắng tối đa | Chỉ User-Agent và Referer |
Luồng DASH .mpd không có DRM | Hỗ trợ | Hỗ trợ qua trình phát VLC tích hợp; chỉ gửi header User-Agent và Referer | Hỗ trợ |
| DRM (Widevine, PlayReady, ClearKey) | Chỉ Android | Không hỗ trợ | Không hỗ trợ |
| Xem lại (catch-up) | Được lưu, phát lại sẽ có sau | ||
Luồng rtmp, rtsp, udp… | Được nhập nguyên vẹn; phát được hay không tuỳ trình phát của từng nền tảng. | ||
Mục plugin:// và #WEBPROP | Không hỗ trợ Bị bỏ qua và liệt kê trong chi tiết nhập. | ||