TS IPTV

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ọiNghĩa là gì
M3UDanh 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ộngDòng đầu là #EXTM3U, và mỗi mục có một dòng #EXTINF đứng trước.
M3U8Cù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 HLSDanh sách kênh IPTV
Mỗi mục làmột đoạn video 2–10 giây của một luồngmộ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-INFchỉ #EXTM3U
Thuộc tính trên #EXTINFkhông cótvg-id="…", group-title="…" và các thuộc tính khác
Ai mở nótrình phát video, tự độngbạ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ínhNghĩ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-tvgTê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-correctionGiá 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ínhBắt buộcNghĩ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-idnê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-namekhôngTên phụ, chỉ dùng để khớp với lịch phát sóng; không thay tên hiển thị.
tvg-logokhôngĐường dẫn ảnh logo (PNG, JPG hoặc SVG).
group-titlekhôngNhó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ôngSố kênh, là số nguyên. Hiển thị trước tên kênh.
tvg-shiftkhôngĐộ lệch giờ lịch phát sóng riêng cho kênh này, tính bằng giờ.
radiokhô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.
mediakhô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-correctionkhôngThô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, referrerkhông chuẩnMộ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:

#EXTVLCOPT

DòngNghĩ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.

#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:

  1. Dòng 1: tiêu đề #EXTM3U, với x-tvg-url trỏ tới lịch phát sóng XMLTV ví dụ.
  2. HLS Test Channel: kênh đơn giản nhất: một dòng #EXTINF với mã, số kênh và nhóm, rồi đến đường dẫn.
  3. Example News: thuộc hai nhóm (News;HD), có logo, và gửi User-Agent cùng Referer qua hai dòng #EXTVLCOPT.
  4. Example Sports: gửi Referer bằng hậu tố |, giá trị đã được mã hoá URL.
  5. Example Radio: radio="true" đánh dấu kênh radio.
  6. Example Protected: luồng DASH có DRM Widevine, khai báo bằng ba dòng #KODIPROP (xem hướng dẫn Kodi).
  7. Example Archive: khai báo xem lại kiểu shift trong 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

  1. 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.
  2. Gõ #EXTM3U ở dòng đầu tiên.
  3. 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.
  4. Dùng dấu nháy kép thẳng " quanh giá trị thuộc tính, không dùng nháy cong “ ”.
  5. 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 .m3u hoặc .m3u8.
  6. 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áchDạng đường dẫn
GitHub (tệp gốc)https://raw.githubusercontent.com/<user>/<repo>/<branch>/playlist.m3u
GitHub Pageshttps://<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áyKhô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.

Thêm vào TS IPTV

Trên điện thoại, máy tính bảng và máy tính

  1. Mở Thêm nguồn IPTV (nút Thêm IPTV trên màn hình chính).
  2. Nhập Tên nguồn, ví dụ “Kênh của tôi”.
  3. 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/.m3u8 trên máy (tối đa 20 MB).
  4. 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

  1. 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.
  2. 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ợ).
  3. 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ỗiBiểu hiệnCá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ự đổiMất logo, mất nhómGõ 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ênTên hiện ra như tvg-id="…", hoặc không có tênViế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 #EXTINFKê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 400Mã 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átDùng #EXTVLCOPT:http-user-agent=… hoặc hậu tố |User-Agent=….
Lưu bằng ANSI/Windows-1252 khi tên có dấuTê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 XMLTVKhông có lịch phát sóngChép mã y hệt, phân biệt hoa thường.
Nhập một luồng HLS như danh sách kênhHàng trăm “kênh” mang tên số đoạnChọ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ỏngMã 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ăngAndroidiOSMáy tính
M3U, M3U mở rộng, M3U8, tệp nén gzipHỗ trợHỗ trợHỗ trợ
Nhiều nhóm, #EXTGRP, số kênh, kênh radioHỗ trợHỗ trợHỗ trợ
Nhiều lịch phát sóng trong x-tvg-url, tvg-shiftHỗ trợHỗ trợHỗ trợ
Header theo kênh (#EXTVLCOPT, |, #KODIPROP)Mọi headerCố gắng tối đaChỉ User-Agent và Referer
Luồng DASH .mpd không có DRMHỗ trợHỗ trợ qua trình phát VLC tích hợp; chỉ gửi header User-Agent và RefererHỗ trợ
DRM (Widevine, PlayReady, ClearKey)Chỉ AndroidKhô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à #WEBPROPKhông hỗ trợ Bị bỏ qua và liệt kê trong chi tiết nhập.