Nếu bạn đã mở DevTools của Chrome trên Netflix hoặc YouTube và thấy các yêu cầu cho các tệp kết thúc bằng .mpd và .m4s, bạn đã xem MPEG-DASH đang hoạt động. Tệp XML là một manifest, các tệp .m4s là các segment fragmented-MP4 ngắn của video và âm thanh, và trình duyệt của bạn đang ghép chúng lại với nhau trong thời gian thực qua HTTP thông thường.
DASH là người anh em chuẩn mở của HLS. Trong khi Apple sở hữu HLS, cơ quan tiêu chuẩn MPEG/ISO sở hữu DASH. Trong khi HLS dùng các playlist văn bản .m3u8, DASH dùng các manifest XML .mpd. Trong khi HLS ban đầu khăng khăng dùng H.264, DASH chưa bao giờ có một sự ưu tiên codec. Hai giao thức giải quyết cùng vấn đề từ các điểm bắt đầu khác nhau, và một dịch vụ phát trực tuyến chu đáo vào năm 2026 vận chuyển cả hai. MPEG-DASH — Dynamic Adaptive Streaming over HTTP — là tiêu chuẩn ISO/IEC 23009-1 để phân phối video dưới dạng một chuỗi các segment fMP4 ngắn được mô tả bởi một manifest XML (.mpd) và được lấy qua HTTP thông thường.
Hướng dẫn này đi qua những gì một .mpd thực sự chứa, cách phân cấp Period / AdaptationSet / Representation của DASH hoạt động, DRM phù hợp ở đâu, lập luận ủng hộ và phản đối DASH so với HLS, và điều gì xảy ra khi bạn cố lưu một trong các luồng này vào ổ đĩa.
Điểm Chính {#key-takeaways}
- MPEG-DASH là tiêu chuẩn mở ISO cho phát trực tuyến HTTP thích ứng — ISO/IEC 23009-1. HLS là RFC 8216.
- Manifest
.mpdlà XML, không phải văn bản thô. Nó mô tả Period, AdaptationSet, và Representation — một phân cấp nghiêm ngặt mà trình phát đi qua tại lúc khởi động và tại mỗi lần chuyển đổi chất lượng. - DASH không phụ thuộc vào codec theo thiết kế. H.264, H.265, VP9, AV1, AAC, Opus — manifest tuyên bố các chuỗi codec và trình phát giải mã.
- Các segment media là fragmented MP4 (
.m4s), cùng các fragment CMAF được dùng bởi HLS hiện đại. Một tập byte có thể phục vụ cả hai giao thức. - DRM sử dụng MPEG Common Encryption (CENC) để một tệp được mã hóa duy nhất hoạt động với Widevine, PlayReady, hoặc FairPlay tùy thuộc vào mô-đun giải mã của client.
- Các nền tảng Apple không hỗ trợ DASH nguyên bản. iPhone, iPad, Safari, và Apple TV yêu cầu HLS — DASH-only là một sự khởi đầu không khả thi.
- Netflix, YouTube, Disney+, Hulu, và Max đều vận chuyển DASH và HLS song song; Apple TV+, iTunes, và Twitch chỉ vận chuyển HLS.
Giải Thích Đơn Giản
Quên các từ viết tắt trong giây lát. Một dịch vụ phát trực tuyến có cùng vấn đề dù theo cách nào: vận chuyển một video dài đến những người xem qua các kết nối lộn xộn, cho phép họ seek tức thì, cho phép họ thích ứng với các thay đổi băng thông giữa chừng, và làm điều đó rẻ qua HTTP thông thường. Giải pháp toàn ngành là cắt video thành các segment ngắn, viết một manifest liệt kê chúng, và để trình phát lấy những gì nó cần theo thứ tự. HLS làm điều này với các playlist văn bản; DASH làm điều này với các manifest XML. Công việc là giống nhau; giấy tờ thì khác.
Từ chỗ ngồi của một trình phát, cách tiếp cận DASH cảm giác gần như giống hệt HLS. Trình phát lấy một manifest nhỏ tại lúc khởi động, học những chất lượng và track âm thanh nào có sẵn, chọn một cái cho mỗi cái dựa trên băng thông và khung nhìn, sau đó lấy một luồng các segment ngắn và đưa chúng cho bộ giải mã. Các chuyển đổi chất lượng xảy ra giữa các segment. Các luồng trực tiếp hoạt động bằng cách có manifest phát triển theo thời gian. Seek là tức thì vì trình phát nhảy đến bất kỳ segment nào bao phủ dấu thời gian mục tiêu.
Sự khác biệt mà người dùng nhìn thấy giữa hai giao thức là nhỏ nhưng có thật. Playlist HLS là văn bản thô; manifest DASH là XML. Các segment HLS trong lịch sử là .ts (MPEG-2 Transport Stream) và bây giờ thường là fMP4; các segment DASH luôn là fMP4, với phần mở rộng .m4s. Các tổ chức tài trợ cũng khác nhau: Apple đã phát minh và quản lý HLS, trong khi DASH ra đời từ MPEG và DASH Industry Forum như một tiêu chuẩn ISO mở không có một nhà cung cấp duy nhất nào phụ trách. Để biết mồi nhử phù hợp, HLS chi tiết bao quát một playlist .m3u8 trông như thế nào từ đầu đến cuối.
DASH Thực Sự Hoạt Động Như Thế Nào
Một luồng DASH là một manifest XML cộng với một đống segment fragmented-MP4, tất cả được phục vụ qua HTTP thông thường. Cùng hình dạng như HLS, định dạng khác trên mỗi lớp.
Manifest .mpd
Điều đầu tiên một trình phát DASH lấy là Media Presentation Description — .mpd. Không giống như playlist văn bản thô của HLS, đây là một tài liệu XML với một schema đã định nghĩa. Đây là một ví dụ được cắt gọn nhẹ:
<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011"
type="static"
mediaPresentationDuration="PT1H30M"
minBufferTime="PT2S"
profiles="urn:mpeg:dash:profile:isoff-live:2011">
<Period id="0" start="PT0S">
<AdaptationSet mimeType="video/mp4" segmentAlignment="true"
startWithSAP="1" maxWidth="1920" maxHeight="1080">
<Representation id="v1" codecs="avc1.640028"
width="1920" height="1080" bandwidth="5000000">
<SegmentTemplate timescale="1000" duration="4000"
initialization="v1/init.mp4"
media="v1/seg-$Number$.m4s"
startNumber="1"/>
</Representation>
<Representation id="v2" codecs="avc1.4d401f"
width="1280" height="720" bandwidth="2800000">
<SegmentTemplate timescale="1000" duration="4000"
initialization="v2/init.mp4"
media="v2/seg-$Number$.m4s"
startNumber="1"/>
</Representation>
</AdaptationSet>
<AdaptationSet mimeType="audio/mp4" lang="en">
<Representation id="a1" codecs="mp4a.40.2" bandwidth="128000">
<SegmentTemplate timescale="1000" duration="4000"
initialization="a1/init.mp4"
media="a1/seg-$Number$.m4s"
startNumber="1"/>
</Representation>
</AdaptationSet>
</Period>
</MPD>
Mọi thuộc tính đều có ý nghĩa cụ thể. type="static" đánh dấu đây là VOD (một luồng trực tiếp là type="dynamic"). mediaPresentationDuration="PT1H30M" là một thời lượng ISO 8601. Mỗi Representation mang một chuỗi codec và ngân sách băng thông. SegmentTemplate là nơi phép màu xảy ra: thay vì liệt kê mọi URL segment theo cách HLS làm, DASH cho phép manifest tuyên bố một mẫu URL và trình phát tính toán các URL trên đường.
Period, AdaptationSet, và Representation
Phân cấp nghiêm ngặt bên trong manifest là trái tim khái niệm của DASH:
- Period — một lát cắt liên tục của dòng thời gian. Hầu hết các bộ phim là một period; các đài phát sóng sử dụng nhiều period để ghép vào các quảng cáo hoặc ranh giới chương.
- AdaptationSet — một bộ sưu tập các mã hóa thay thế của cùng nội dung, có thể hoán đổi tại thời gian chạy. Một bộ phim điển hình có một AdaptationSet video, một hoặc nhiều AdaptationSet âm thanh (một cho mỗi ngôn ngữ), và một hoặc nhiều AdaptationSet phụ đề.
- Representation — một mã hóa cụ thể đơn lẻ. 1080p H.264 ở 5 Mbps là một Representation; 720p H.264 ở 2.8 Mbps là một cái khác; 720p VP9 ở 1.5 Mbps là một cái khác. Trình phát chọn một Representation cho mỗi AdaptationSet và có thể chuyển sang một cái khác tại bất kỳ ranh giới segment nào bên trong cùng AdaptationSet.
Mô hình ba cấp này có cấu trúc hơn cách tiếp cận phẳng các-biến-thể-và-segment của HLS, đó là lý do tại sao DASH thắng về khả năng mở rộng: nhiều track âm thanh, các track trick-play, các track hình thu nhỏ, và chèn quảng cáo theo period phù hợp gọn gàng mà không cần phát minh ra cú pháp manifest mới.
Segment và Khởi Tạo
Các byte của một Representation đến trong hai dạng. Segment khởi tạo là một tệp fMP4 nhỏ chứa hộp moov — các tham số codec, metadata track, và cấu hình bộ giải mã. Trình phát lấy nó một lần cho mỗi Representation. Các media segment là âm thanh và video thực tế, mỗi cái thường dài 2 đến 6 giây, được cắt trên ranh giới khung hình khóa cho các track video để trình phát có thể bắt đầu giải mã từ đầu bất kỳ segment nào.
Khi manifest đặt startWithSAP="1", mỗi segment bắt đầu với một Stream Access Point — tương đương với cờ EXT-X-INDEPENDENT-SEGMENTS của HLS trong DASH, đảm bảo rằng các segment có thể giải mã độc lập. Không có đảm bảo đó, các segment hạ nguồn có thể phụ thuộc vào các segment trước đó, làm cho việc chuyển đổi thích ứng không an toàn. Vì các URL SegmentTemplate được điều khiển bởi mẫu (v1/seg-$Number$.m4s), manifest có thể mô tả một bộ phim 90 phút trong vài trăm byte XML. SegmentTimeline là lựa chọn thay thế khi các thời lượng không đồng nhất.
Common Encryption (CENC)
Câu chuyện DRM của DASH chạy qua MPEG Common Encryption (CENC), ISO/IEC 23001-7. CENC mã hóa chính các media segment bằng AES-128 ở chế độ CTR dưới một khóa nội dung, sau đó tuyên bố hệ thống DRM nào có thể phát hành khóa đó. Trong .mpd, bạn sẽ thấy các phần tử ContentProtection như sau:
<ContentProtection schemeIdUri="urn:mpeg:dash:mp4protection:2011" value="cenc"
cenc:default_KID="34e5db32-8625-47cd-ba06-68fca0655a72"/>
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
<cenc:pssh>AAAAW3Bzc2gAAAAA...</cenc:pssh>
</ContentProtection>
<ContentProtection schemeIdUri="urn:uuid:9a04f079-9840-4286-ab92-e65be0885f95">
<cenc:pssh>AAACfHBzc2gAAAAA...</cenc:pssh>
</ContentProtection>
Khối đầu tiên tuyên bố ID khóa mặc định theo CENC. Khối thứ hai là UUID của Widevine; khối thứ ba là của PlayReady. Mô-đun Giải mã Nội dung của trình duyệt đọc bất kỳ khối nào khớp với DRM được hỗ trợ của nó, gửi một yêu cầu giấy phép đến máy chủ giấy phép của dịch vụ với dữ liệu PSSH (Protection System Specific Header) được nhúng, và nhận về khóa nội dung cần thiết để giải mã các segment. Để biết toàn cảnh, xem cách Widevine và PlayReady kiểm soát các luồng cao cấp. Hỗ trợ FairPlay trong DASH hiếm gặp trong lịch sử — FairPlay được thiết kế cho HLS — nhưng CMAF + mã hóa CBCS đã làm cho FairPlay-trên-DASH chéo-DRM về mặt kỹ thuật có thể trên một tập nhỏ các nền tảng.
Không Phụ Thuộc Vào Codec Theo Thiết Kế
HLS ban đầu ưu tiên H.264 (các thiết bị Apple đầu tiên không thể giải mã bất cứ thứ gì khác), và việc thêm các codec mới mất một quy trình đặc tả nhiều năm. DASH chưa bao giờ chọn một codec — manifest chỉ tuyên bố các chuỗi codec (avc1.640028, hev1.1.6.L150.B0, vp09.00.50.08, av01.0.05M.08) và trình phát kiểm tra xem bộ giải mã của nó có hỗ trợ chúng không. Đây là lý do YouTube có thể vận chuyển AV1 qua DASH nhiều năm trước khi hỗ trợ HLS tương đương được vận chuyển tại Apple. Vì lớp manifest là điều duy nhất các trình phát DASH cần hiểu, VidMost có thể phân tích một .mpd, đi qua các URL SegmentTemplate, lấy mọi fragment fMP4, và remux kết quả mà không quan tâm codec nào ở bên trong.
DASH so với HLS: So Sánh Thẳng Thắn
DASH và HLS giải quyết cùng vấn đề với các đánh đổi khác nhau. Không cái nào tốt hơn về mặt phổ quát. Đây là lập luận cho mỗi cái trên các trục thực sự quan trọng.
Định Dạng Manifest
.mpd của DASH là XML với một schema đã định nghĩa — có thể mở rộng (các tính năng mới có các phần tử mới, được xác thực bởi schema, các trình phát cũ bỏ qua những gì chúng không hiểu) nhưng dài dòng. .m3u8 của HLS là văn bản thô với các thẻ #EXT-X-, dễ đọc và dễ grep. DASH thắng về cấu trúc và xác thực máy; HLS thắng về khả năng đọc của con người.
Độ Trễ
Cả hai đều bắt đầu với độ trễ giây-đến-hàng chục-giây. Cả hai đều đã vận chuyển các phần mở rộng độ trễ thấp: LL-HLS sử dụng các segment một phần, tải lại playlist chặn, và các gợi ý preload (Apple đã thay thế thiết kế HTTP/2 push trước đó của mình bằng EXT-X-PRELOAD-HINT), trong khi LL-DASH sử dụng các segment được mã hóa transfer-encoded thành chunk và profile Common Media Application Format Live. Cả hai đều nhắm đến độ trễ glass-to-glass 2–5 giây trong sản xuất. Đối với độ trễ dưới một giây, bạn rớt xuống WebRTC.
Hỗ Trợ Codec
DASH đã không phụ thuộc vào codec từ ngày đầu. H.264, H.265, VP9, AV1, AAC, Opus, FLAC, AC-4 — manifest tuyên bố chuỗi codec và trình phát quyết định. HLS bắt đầu chỉ-H.264 vì phần cứng iPhone gốc đòi hỏi điều đó. Apple đã từng bước mở rộng hỗ trợ: H.265 qua fMP4 kể từ 2017, Dolby Vision và HDR10 kể từ 2018, AV1 kể từ thế hệ iPhone 15. HLS hiện đại không bị khóa-H.264, nhưng lịch sử codec của giao thức có một độ trễ mà DASH chưa bao giờ có.
DRM
Cả hai đều dựa vào mã hóa cấp segment dựa trên AES, nhưng các hệ thống DRM trên đầu khác nhau. DASH thường sử dụng CENC với Widevine và PlayReady — một tệp được mã hóa duy nhất hoạt động với cả hai vì khóa nội dung là giống nhau; chỉ định dạng yêu cầu giấy phép khác nhau. HLS trong lịch sử sử dụng FairPlay Streaming (chỉ Apple) cộng với, ngày càng nhiều, Widevine thông qua CMAF + CBCS. Khi dịch vụ của bạn ở trên CMAF, cùng các segment được mã hóa có thể phục vụ cả hai loại manifest và cả ba hệ thống DRM lớn.
Hỗ Trợ Apple/iOS
HLS là bắt buộc trên iOS, iPadOS, Safari, và Apple TV. DASH không được hỗ trợ nguyên bản trên bất kỳ nền tảng Apple nào. Đây là yếu tố quyết định lớn nhất trong chiến lược DASH-so-với-HLS. Phát DASH trong Safari chỉ có thể thông qua Media Source Extensions cộng với một shim JavaScript như shaka-player hoặc dash.js, và ngay cả khi đó nó cũng không bao phủ mọi trường hợp ngoại lệ iOS (AirPlay, điều khiển màn hình khóa, picture-in-picture). Bất kỳ dịch vụ nào nhắm đến iPhone phải vận chuyển HLS. DASH-only là một sự khởi đầu không khả thi.
Tương Thích CDN Và Sự Hội Tụ CMAF
Cả hai giao thức đều là HTTP thuần. Bất kỳ CDN nào phục vụ các tệp tĩnh đều có thể phục vụ một luồng DASH hoặc HLS — chi phí và cấu hình CDN về cơ bản giống hệt nhau. Sự phát triển quan trọng nhất của thập kỷ qua là DASH và HLS hiện chia sẻ các byte segment. CMAF — Common Media Application Format, ISO/IEC 23000-19 — định nghĩa một profile fragmented-MP4 thỏa mãn cả DASH và HLS hiện đại. Một dịch vụ phát trực tuyến có thể mã hóa một lần thành các segment CMAF và viết cả một .mpd và một .m3u8 trỏ đến chính xác cùng các tệp .m4s. Đây là những gì thực sự đang xảy ra tại YouTube, Netflix, Apple, và hầu hết các nhà cung cấp video được lưu trữ vào năm 2026.
Ai Vận Chuyển Gì Vào Năm 2026
- Netflix — DASH chính trên web, Windows, Android, các TV thông minh, và console; HLS dự phòng cho Safari và iOS.
- YouTube — DASH trên web và Android với VP9 / AV1; HLS cho iOS, Safari, AirPlay, và hầu hết các ứng dụng TV.
- Apple TV+, iTunes Store — chỉ HLS.
- Twitch — chỉ HLS, cho trực tiếp và VOD, kể từ khi nghỉ hưu phát RTMP vào năm 2014.
- Disney+, Hulu, Max, Amazon Prime Video — DASH hoặc HLS tùy thuộc vào client, thường là cùng các segment CMAF dưới cả hai manifest.
HLS sở hữu các thiết bị Apple và chia sẻ phần còn lại của thị trường với DASH. Hầu hết các dịch vụ lớn hỗ trợ cả hai vì lựa chọn thay thế là để một đối tượng trên bàn.
Điều Này Có Ý Nghĩa Gì Nếu Bạn Muốn Lưu Video
Biết DASH hoạt động như thế nào làm cho vấn đề tải xuống thực tế trở nên cụ thể. Mọi vấn đề mà người dùng HLS gặp khi cố lưu một luồng cũng áp dụng cho DASH, thường tệ hơn:
- Save As của trình duyệt chỉ lấy
.mpd. Đó là manifest XML. Nó chứa không byte video nào. Mở nó trong VLC chỉ hoạt động khi phiên mạng vẫn còn hiệu lực và các URL segment chưa hết hạn. - Các segment DASH là tệp
.m4s— một init segment cộng với hàng chục hoặc hàng trăm media segment cho mỗi Representation. Mỗi cái là một đoạn fragmented-MP4 vô dụng một mình. Để có được một tệp có thể phát đơn lẻ, bạn phải lấy init segment cộng với mọi media segment theo thứ tự và remux chúng. (Nếu bạn mơ hồ về những gì thực sự nằm trong một.m4s, xem container so với codec.) - Bạn sẽ phải phân tích XML, đi qua các URL SegmentTemplate, và remux. Điều đó có nghĩa là viết mã hiểu các trình giữ chỗ
$Number$,$Time$,$RepresentationID$, và$Bandwidth$, lắp ráp các URL, lấy chúng song song mà không đập CDN, và đưa các byte quaffmpeghoặcmp4box. Đó không phải là một script cuối tuần — đó là phần mềm thực sự. - Lựa chọn biến thể quan trọng. Chọn sai Representation và bạn đã tải xuống một bản sao 480p của một bộ phim 1080p. Token cũng hết hạn — nhiều URL
.mpdvà segment được ký và trở nên không hợp lệ trong vài phút.
VidMost xử lý tất cả điều này. Nó phân tích .mpd, chọn các Representation video và âm thanh chất lượng cao nhất, tải xuống mọi segment song song, và remux các fragment CMAF thành một MP4 sạch duy nhất. Đối với các luồng DASH được bảo vệ bởi DRM (thiết lập Widevine + PlayReady phổ biến), hỗ trợ Widevine L3 tích hợp của VidMost hoạt động bất cứ nơi nào việc phát L3 có sẵn — trần chất lượng thực tế được thiết lập bởi dịch vụ và mức DRM, và các nền tảng cao cấp thường giới hạn các luồng L3 ở 480p–720p. Bạn dán một URL; bạn nhận một MP4.
Những Hiểu Lầm Và Cạm Bẫy Phổ Biến
Một số ít sự nhầm lẫn liên quan đến DASH xuất hiện liên tục trong các chủ đề diễn đàn. Đáng để làm rõ.
- “MPEG-DASH là thứ của Google.” Không phải vậy. DASH là một tiêu chuẩn mở MPEG / ISO (ISO/IEC 23009-1), được dẫn dắt bởi DASH Industry Forum — một liên minh bao gồm Adobe, Microsoft, Netflix, và Qualcomm. Google đã giúp phát triển nó và sử dụng nó trên YouTube, nhưng không có nhà cung cấp duy nhất nào sở hữu đặc tả.
- “DASH mới hơn và do đó tốt hơn.” DASH (2012) mới hơn HLS (2009), nhưng “tốt hơn” phụ thuộc vào tổ hợp nền tảng của bạn. Nếu đối tượng của bạn là trên iPhone, HLS thắng bằng vũ lực. Nếu đối tượng của bạn là trên Android và các TV thông minh với tính linh hoạt codec tối đa, DASH thắng. Hầu hết các dịch vụ vận chuyển cả hai.
- “
.mpdlà video.” Không phải vậy. Nó là manifest. Video thực tế nằm trong các segment.m4smà manifest tham chiếu. - “Nếu một trang web sử dụng DASH, trình phát HLS của tôi không thể phát nó.” Đúng đối với các trình phát gốc. Nhưng hầu hết các trình phát web hiện đại — shaka-player, dash.js, hls.js, video.js — xử lý cả hai bên trong trình duyệt bằng cách đưa các segment đến phần tử video qua Media Source Extensions.
- “DASH luôn có nghĩa là DRM.” Không phải vậy. Rất nhiều luồng DASH được vận chuyển mà không có mã hóa: phát sóng sự kiện trực tiếp, các nền tảng giáo dục, và hầu hết nội dung YouTube miễn phí. DRM là một lớp tùy chọn được tuyên bố thông qua các phần tử
ContentProtection.
Suy Nghĩ Kết Luận
DASH là người sinh đôi vũ trụ song song của HLS. Cả hai đều cắt video thành các segment ngắn, mô tả chúng trong một manifest, và vận chuyển chúng qua HTTP thông thường. Sự khác biệt — XML so với văn bản thô, tiêu chuẩn ISO so với đặc tả Apple, không phụ thuộc codec so với phụ thuộc lịch sử codec — quan trọng bên trong ngành nhưng hiếm khi quan trọng với người xem. Điều quan trọng là các dịch vụ phát trực tuyến cấp phép nội dung từ mọi hãng phim trên thế giới đã chọn các giao thức này, ngày càng hội tụ trên các segment CMAF chia sẻ dưới cả hai manifest. Một khi bạn có thể nhận ra một yêu cầu .mpd và hiểu phân cấp Period / AdaptationSet / Representation, hành vi kỳ lạ của phát trực tuyến hiện đại ngừng bí ẩn — tất cả đều là cùng vòng lặp: lấy manifest, chọn biến thể, lấy segment, giải mã, lặp lại. Nếu bạn muốn bỏ qua hoàn toàn lớp giao thức và chỉ lưu video, VidMost xử lý HLS, MPEG-DASH, fMP4, CMAF, và các luồng được bảo vệ bởi DRM.
Đọc thêm
- Video Trực Tuyến Thực Sự Phát Như Thế Nào — quy trình phát trực tuyến toàn cảnh từ camera đến màn hình của bạn.
- HLS Và M3U8 Là Gì? — giao thức anh em được bao quát từ đầu đến cuối.
- Tại Sao Chất Lượng Video Thay Đổi Giữa Chừng — logic ABR bên trong mọi trình phát DASH và HLS.
- Container Video So Với Codec — thực sự có gì bên trong một segment
.m4s. - Nội Dung Được Bảo Vệ Bởi DRM Là Gì? — cách Widevine, PlayReady, và FairPlay kiểm soát các biến thể được mã hóa mà bạn không thể chỉ lưu.