Dynamic Adaptive Streaming over HTTP (DASH) یک استاندارد بینالمللی برای انتقال تطبیقی مولتیمدیای استریم است که توسط MPEG (Moving Picture Experts Group) توسعه یافته است. DASH تحویل ویدیو و صدا را از طریق HTTP با استفاده از توصیف جریان در قالب XML به نام Media Presentation Description (MPD) و تقسیم محتوا به بخشهایی با نرخبیتهای مختلف فراهم میکند. طبق گزارش Bitmovin Video Developer Report (2025)، 58% از توسعهدهندگان ویدیو از DASH استفاده میکنند که آن را به دومین پروتکل محبوب پس از HLS تبدیل میکند.
نکات اصلی
MPEG-DASH (Dynamic Adaptive Streaming over HTTP) — یک استاندارد بینالمللی ISO/IEC 23009-1 است که در سال 2012 به عنوان پاسخی به تفرق راهحلهای اختصاصی استریمینگ تطبیقی منتشر شد. برخلاف HLS (پروتکل اختصاصی Apple) و Smooth Streaming (Microsoft)، DASH از ابتدا به عنوان یک استاندارد باز و مستقل از فروشنده طراحی شد که پشتیبانی گسترده آن در صنعت را تضمین کرد.
نوآوری اصلی DASH — جداسازی توصیف جریان و محتوای رسانه است. توصیف جریان در فایل XML به نام MPD (Media Presentation Description) ذخیره میشود که شامل تمام اطلاعات درباره گزینههای موجود است: نرخبیتها، وضوحها، کدکها، زیرنویسها، مسیرهای صوتی. محتوای رسانه به صورت بخشهای جداگانه (معمولاً fMP4) ذخیره میشود که میتوانند به طور مستقل از طریق HTTP بارگیری شوند. چنین معماری به زیرساخت سرور اجازه میدهد تا حداکثر سادگی را داشته باشد — هر سرور HTTP قادر به ارائه محتوای DASH است.
تطبیقپذیری DASH از طریق مالتیپلکس کردن انواع یک محتوا پیادهسازی میشود. سرور چندین Representation (نمایش) — کپیهایی از محتوا با پارامترهای فشردهسازی مختلف — آماده میکند. کلاینت پهنای باند کانال را تحلیل کرده و به صورت پویا بین نمایشها جابهجا میشود و نسبت بهینه کیفیت و پایداری پخش را انتخاب میکند. طبق تحقیقات آکادمیک (IEEE Access, 2024)، DASH با الگوریتم BOLA در مقایسه با HLS در اتصال ناپایدار 22% تغییر نرخبیت کمتری نشان میدهد.
MPEG کار بر روی DASH را در سال 2010 پس از تحلیل راهحلهای موجود آغاز کرد: Apple HLS، Microsoft Smooth Streaming و Adobe HDS. اولین نسخه استاندارد (ISO/IEC 23009-1:2012) در سال 2012 منتشر شد. نسخه دوم (2014) پشتیبانی از رویدادها، درج تبلیغات بهبودیافته و تطبیق کنترلشده توسط سرور را اضافه کرد. نسخه سوم (2019) — پشتیبانی از HDR، 8K، ویدئوی لمسی و یکپارچگی بهبودیافته با MMT (MPEG Media Transport) برای شبکههای 5G.
در سال 2024، MPEG DASH نسل بعدی را اعلام کرد که شامل پشتیبانی از کدکهای عصبی، رندرینگ ابری و بهینهسازی برای سناریوهای Extended Reality (XR) است. نوآوری کلیدی — Neural Network-Based Video Coding (NNVC) که از مدلهای ML برای رمزگشایی در سمت کلاینت استفاده میکند و میتواند نرخبیت را 30-50% با حفظ کیفیت کاهش دهد.
فرآیند پخش جریان DASH از چهار مرحله متوالی تشکیل شده است: دریافت MPD، تجزیه توصیف جریان، انتخاب نمایش اولیه و جابهجایی پویا بین نمایشها. هر مرحله ویژگی خاص خود را دارد که بر کیفیت تجربه کاربر تأثیر میگذارد.
پلیر فایل MPD را از URL مشخص بارگیری میکند. MPD شامل ساختار XML با توصیف کل جریان است: مدت محتوا، مقیاس زمانی، دورههای موجود (Period)، مجموعههای تطبیق (AdaptationSet) و نمایشها (Representation) با پارامترهای مشخص کدگذاری. پلیر MPD را تجزیه کرده و یک مدل داخلی از منابع رسانهای موجود ایجاد میکند.
مثال یک فایل پایه MPD برای محتوای VOD با دو وضوح:
<?xml version="1.0" encoding="utf-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011"
profiles="urn:mpeg:dash:profile:isoff-live:2011"
type="static"
mediaPresentationDuration="PT1H30M">
<Period duration="PT1H30M">
<AdaptationSet mimeType="video/mp4">
<Representation bandwidth="5000000"
width="1920" height="1080"
codecs="avc1.640028"/>
<Representation bandwidth="1000000"
width="640" height="360"
codecs="avc1.64001E"/>
</AdaptationSet>
</Period>
</MPD>
پس از انتخاب نمایش اولیه، پلیر شروع به بارگیری بخشها میکند. هر بخش شامل چند ثانیه محتوا است (معمولاً 2-10 ثانیه). پلیر بافر را برای چند بخش جلوتر نگه میدارد که پایداری در برابر افتهای کوتاهمدت سرعت شبکه را تضمین میکند. الگوریتم انتخاب نمایش (ABR) به طور مداوم سرعت بارگیری بخشها را پایش کرده و درباره جابهجایی بین نرخبیتهای موجود تصمیم میگیرد.
الگوریتمهای مدرن ABR برای DASH، مانند BOLA (Buffer Occupancy based Lyapunov Algorithm) و Pensieve (مبتنی بر Reinforcement Learning)، نه تنها پهنای باند فعلی، بلکه اندازه بافر، نوع محتوا (ورزش، اخبار، فیلم) و حتی مصرف انرژی دستگاه را نیز در نظر میگیرند. BOLA که بخشی از dash.js و ExoPlayer است، تعداد جابهجاییهای نرخبیت را با حفظ بافر پایدار به حداقل میرساند که توسط تحقیقات ACM (Spiteri et al., 2020) تأیید شده است.
ساختار سلسلهمراتبی جریان DASH در چهار سطح سازماندهی شده است: MPD → Period → AdaptationSet → Representation. هر سطح جزئیات را افزایش میدهد و امکان توصیف سناریوهای پیچیده — از VOD ساده تا پخش زنده با درج تبلیغات و ویدیوی چندزاویهای — را فراهم میکند.
MPD — عنصر ریشه، که کل ارائه رسانه را توصیف میکند. ویژگیهای MPD نوع جریان (static برای VOD، dynamic برای زنده)، مدت کل، مقیاس زمانی، پروفایل و اطلاعات DRM را تعیین میکنند. MPD میتواند یک یا چند Period داشته باشد که هر کدام یک بازه زمانی مستقل از محتوا را نشان میدهد.
Period — بخش زمانی ارائه. برای VOD از یک Period برای کل محتوا استفاده میشود. برای پخش زنده با درج تبلیغات، Period میتواند به صورت پویا تغییر کند — پلیر MPD بهروزرسانیشده را بارگیری کرده و Period جدید مربوط به بلوک تبلیغاتی را تشخیص میدهد. هر Period شامل یک یا چند AdaptationSet است.
AdaptationSet — گروهی از نمایشهای قابل جایگزینی یک نوع رسانه: ویدیو، صدا، زیرنویس. در داخل AdaptationSet، همه نمایشها فقط از نظر نرخبیت و/یا وضوح متفاوت هستند اما همان محتوا را کدگذاری میکنند. ویژگی مهم: پلیر میتواند بین نمایشهای داخل یک AdaptationSet در مرز بخشها بدون قطع پخش جابهجا شود.
Representation — یک گزینه کدگذاری خاص با نرخبیت، وضوح و کدک مشخص. برای هر Representation در MPD، الگوی URL برای بارگیری بخشها مشخص میشود. DASH از یک سیستم آدرسدهی انعطافپذیر بخشها استفاده میکند — از طریق الگوهای URL با جایگذاری شماره بخش و زمان ($Number$، $Time$)، که به سرور اجازه میدهد بدون نیاز به ذکر هر بخش در MPD، نام فایلها را به صورت پویا تولید کند.
بخشهای DASH میتوانند دو نوع باشند: نوع Segment (فقط دادههای رسانه) و نوع Subsegment (بخشی از بخش برای دسترسی دقیقتر). برای کدگذاری محتوای DASH از ابزارهایی مانند FFmpeg یا کدگذارهای بستهبندی استفاده میشود. مثال ایجاد جریان DASH از یک فایل ورودی:
import subprocess
subprocess.run([
"ffmpeg",
"-i", "input.mp4",
"-filter_complex",
"[0:v]split=2[v1][v2];[v1]scale=1920:1080[v1out];[v2]scale=640:360[v2out]",
"-map", "[v1out]", "-b:v:0", "5000k",
"-map", "[v2out]", "-b:v:1", "1000k",
"-map", "0:a",
"-f", "dash",
"-seg_duration", "4",
"-use_template", "1",
"-use_timeline", "1",
"dash/stream.mpd"
])
انتخاب بین DASH و HLS یکی از تصمیمهای کلیدی در طراحی سیستم استریمینگ ویدیو است. هر دو پروتکل یک کار را حل میکنند (تحویل تطبیقی ویدیو از طریق HTTP)، اما تفاوتهای اساسی در معماری، پشتیبانی از کدکها و اکوسیستم دارند. بیایید آنها را بر اساس پارامترهای کلیدی بررسی کنیم.
| پارامتر | DASH | HLS |
|---|---|---|
| استاندارد | بینالمللی (ISO/IEC 23009-1) | اختصاصی (RFC 8216، Apple) |
| توصیف جریان | XML (MPD) | پلیلیست M3U8 |
| کدکها | هر نوع (H.264، HEVC، AV1، VP9) | محدود (H.264، HEVC، AV1 از 2023) |
| فرمت بخشها | fMP4 (اصلی)، MPEG-2 TS | MPEG-2 TS، fMP4 |
| DRM | CENC (یکپارچه برای همه DRM) | FairPlay، Widevine (جداگانه) |
| پشتیبانی iOS | از طریق پلیرهای شخص ثالث | بومی (AVPlayer، Safari) |
| مرورگرها | Chrome، Firefox، Edge (از طریق MSE) | Safari (بومی)، بقیه از طریق MSE |
مزیت کلیدی DASH — استقلال از کدکها. اگر HLS در ابتدا کدکها را به موارد پشتیبانیشده توسط Apple محدود میکرد (H.264، HEVC و اخیراً AV1)، DASH میتواند از هر کدکی که توسط پلیر پشتیبانی میشود استفاده کند: VP9/VP8 (بحرانی برای YouTube و Chrome)، AV1 (برای کارایی)، H.264/HEVC (برای سازگاری). این DASH را به انتخاب ترجیحی برای سرویسهای کراس پلتفرم تبدیل میکند که در آن یک جریان واحد برای همه دستگاهها مورد نیاز است.
نقطه ضعف DASH در iOS — عدم پشتیبانی بومی در Safari و AVPlayer. توسعهدهندگان برنامههای iOS باید از پلیرهای شخص ثالث سازگار با HLS یا کتابخانههایی مانند libdash با یکپارچگی از طریق VTDecoder استفاده کنند. در عمل این بدان معناست که برای پروژههای iOS-first، HLS استاندارد de-facto باقی میماند، در حالی که برای Android و پلتفرمهای وب، DASH راهحل انعطافپذیرتر و قدرتمندتری است.
یکپارچگی DASH در برنامههای موبایل به پلتفرم بستگی دارد. در Android، DASH به طور مستقیم از طریق ExoPlayer با ماژول توسعه پشتیبانی میشود. در iOS استفاده از کتابخانههای شخص ثالث مانند libdash با یکپارچگی از طریق AVFoundation یا MPEGDASHPlayer مورد نیاز است. بیایید پیادهسازی عملی را برای هر دو پلتفرم بررسی کنیم.
ExoPlayer از Google پشتیبانی داخلی از DASH را از طریق ماژول `exoplayer-dash` فراهم میکند. اتصال جریان DASH تفاوتی با سایر فرمتها ندارد — کافی است URI فایل MPD را به MediaItem منتقل کنید. ExoPlayer به طور خودکار فرمت محتوا را تشخیص داده و رندرر مربوطه را راهاندازی میکند و از تمام الگوریتمهای استاندارد ABR پشتیبانی میکند.
val player = ExoPlayer.Builder(this).build()
val dashMediaItem = MediaItem
.Builder()
.setUri("https://example.com/dash/stream.mpd")
.setMimeType("application/dash+xml")
.build()
player.setMediaItem(dashMediaItem)
player.prepare()
player.playWhenReady = true
Common Encryption (CENC) — یکی از قابلیتهای کلیدی DASH است که امکان استفاده از یک جریان رسانه با سیستمهای DRM مختلف را فراهم میکند. فایل MPD شامل عناصر XML ContentProtection با شناسههای سیستمهای DRM (Widevine، PlayReady، FairPlay) است. کلاینت بر اساس پلتفرم خود سیستم DRM مناسب را انتخاب کرده و از طریق سرور مجوز، مجوز درخواست میکند.
val drmLicenseUri = Uri.parse("https://license.example.com/wv")
val drmSessionManager = DefaultDrmSessionManager
.Builder()
.setUuidAndExoMediaDrmProvider(
C.WIDEVINE_UUID,
FrameworkMediaDrm.DEFAULT_PROVIDER
)
.build(drmLicenseUri, null)
val mediaItem = MediaItem
.Builder()
.setUri("https://example.com/encrypted/stream.mpd")
.setDrmConfiguration(
MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID)
.setLicenseUri("https://license.example.com/wv")
.build()
)
.build()
برنامههای موبایل به دلیل محدودیتهای پهنای باند و مصرف انرژی نیاز به تنظیم خاص DASH دارند. توصیههای اصلی شامل: تنظیم بافر حداقل 2-3 بخش برای پایداری در برابر افتهای کوتاهمدت سرعت، استفاده از بخشهایی با مدت 2-4 ثانیه برای واکنش سریعتر به تغییرات شبکه، و بارگیری قبلی بخش بعدی هنگام تغییر کیفیت است.
برای صرفهجویی در ترافیک در شبکههای موبایل، Bitmovin (2024) استفاده از Content Steering — مکانیزمی مشابه عملکرد مشابه HLS که امکان هدایت پویای کلاینت به گره CDN بهینه را فراهم میکند — توصیه میکند. DASH Content Steering در مشخصات ISO/IEC 23009-1:2022 توصیف شده و در dash.js 4.5+ و ExoPlayer 2.18+ پشتیبانی میشود.
سوالات متداول
DASH — یک استاندارد باز بینالمللی MPEG است که به فروشنده وابسته نیست. برخلاف HLS (پروتکل اختصاصی Apple)، DASH از هر کدکی پشتیبانی میکند، از توصیف جریان XML (MPD) به جای M3U8 استفاده میکند و یک سیستم DRM واحد از طریق CENC فراهم میکند. HLS پشتیبانی بومی در iOS دارد، DASH برای راهحلهای کراس پلتفرم انعطافپذیرتر است.
در Android پلیر اصلی برای DASH ExoPlayer از Google با ماژول exoplayer-dash است. در iOS از راهحلهای شخص ثالث مانند libdash با یکپارچگی از طریق AVFoundation یا پلیرهای تجاری (THEOplayer، Bitmovin) استفاده میشود. در مرورگرهای وب، DASH از طریق dash.js با استفاده از MediaSource Extensions پخش میشود.
MPD (Media Presentation Description) — یک فایل XML است که ساختار جریان DASH را توصیف میکند: مدت محتوا، نرخبیتهای موجود، وضوحها، کدکها، فرمتهای بخش و مکان آنها. MPD به عنوان نقطه ورود برای پلیر عمل میکند و جایگزین پلیلیست اصلی در HLS میشود. بدون فایل MPD، پخش محتوای DASH غیرممکن است.
بله، DASH هم از VOD و هم از پخش زنده پشتیبانی میکند. برای پخش زنده از نوع dynamic MPD با بهروزرسانی خودکار استفاده میشود. سرور به صورت دورهای MPD را بهروزرسانی میکند، بخشهای جدید اضافه کرده و بخشهای قدیمی را حذف میکند. Low-Latency DASH (LL-DASH) با رمزگذاری تکهای امکان دستیابی به تأخیر 3-8 ثانیه را فراهم میکند که قابل مقایسه با LL-HLS است.
DASH از Common Encryption (CENC، ISO/IEC 23001-7) استفاده میکند که امکان رمزگذاری محتوای رسانه یک بار و رمزگشایی آن توسط هر سیستم DRM را فراهم میکند. MPD شامل عناصر XML ContentProtection با مشخص کردن DRMهای پشتیبانیشده (Widevine، PlayReady، FairPlay) است. پلیر بر اساس پلتفرم خود DRM مناسب را انتخاب کرده و از طریق URL مشخص شده مجوز درخواست میکند.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید