קל לארגן דפים בעזרת אוספים
אפשר לשמור ולסווג תוכן על סמך ההעדפות שלך.
לקוחות של נגני מדיה יכולים להעביר מידע חשוב לכלי להעברת תוכן
רשתות (CDN) עם כל בקשה לאובייקט. העברת הנתונים האלה יכולה לשפר את QoS
מעקב, אופטימיזציה של תנועה דינמית וביצועי הצגת מודעות, בסופו של דבר
שיפור חוויית הצרכן.
ההטמעה ב-ExoPlayer מבוססת על המפרט שמוגדר
CTA-5004
תמיכה ב-CMCD ב-Expo Player
אפשר להפעיל תמיכה ב-CMCD ב-ExoPlayer רק לפורמטים מותאמים של סטרימינג.
כמו DASH , HLS ו-SmoothStreaming.
מפתחות נתונים של CMCD
מפתחות הנתונים של CMCD מסווגים לארבעה סוגים שונים:
CMCD-Request: מפתחות שהערכים שלהם משתנים בהתאם לבקשה.
CMCD-Object: מפתחות שהערכים שלהם משתנים בהתאם לאובייקט שביקשתם.
CMCD-Status: מפתחות שהערכים שלהם לא משתנים בהתאם לכל בקשה או אובייקט.
CMCD-Session: מפתחות שהערכים שלהם צפויים להיות לא-משתנים לאורך
כל משך החיים של הסשן.
המצבים של העברת הנתונים
ניתן להעביר נתוני CMCD באחת משתי השיטות הבאות:
ככותרת של בקשת HTTP מותאמת אישית, שהיא התנהגות ברירת המחדל.
כארגומנט של שאילתת HTTP.
הפעלת CMCD
כדי להפעיל CMCD, צריך ליצור מופע של CmcdConfiguration.Factory
ומעבירים אותה אל MediaSource.Factory, שמשמש לבניית
הנגן. אפשר להשתמש בברירת המחדל של CmcdConfiguration.Factory או לספק
מפעל מותאם אישית משלך, שנקרא בכל פעם שמקור מדיה מותאם
נוצר עבור פריט המדיה הנתון.
הפעלת CMCD עם הגדרות ברירת המחדל להגדרות המקוריות
Kotlin
// Create media source factory and set default cmcdConfigurationFactory.valmediaSourceFactory=DefaultMediaSourceFactory(context).setCmcdConfigurationFactory(CmcdConfiguration.Factory.DEFAULT)
Java
// Create media source factory and set default cmcdConfigurationFactory.MediaSource.FactorymediaSourceFactory=newDefaultMediaSourceFactory(context).setCmcdConfigurationFactory(CmcdConfiguration.Factory.DEFAULT);
הפעלת CMCD עם הגדרות יצרן בהתאמה אישית
Kotlin
valcmcdConfigurationFactory=object:CmcdConfiguration.Factory{overridefuncreateCmcdConfiguration(mediaItem:MediaItem):CmcdConfiguration{valcmcdRequestConfig=object:CmcdConfiguration.RequestConfig{overridefunisKeyAllowed(key:String):Boolean{returnkey=="br"||key=="bl"}overridefungetCustomData():ImmutableListMultimap<@CmcdConfiguration.HeaderKeyString,String>{returnImmutableListMultimap.of(CmcdConfiguration.KEY_CMCD_OBJECT,"key1=stringValue")}overridefungetRequestedMaximumThroughputKbps(throughputKbps:Int):Int{return5*throughputKbps}}valsessionId=UUID.randomUUID().toString()valcontentId=UUID.randomUUID().toString()returnCmcdConfiguration(sessionId,contentId,cmcdRequestConfig,MODE_QUERY_PARAMETER)}}// Create media source factory and set your custom cmcdConfigurationFactory.valmediaSourceFactory=DefaultMediaSourceFactory(context).setCmcdConfigurationFactory(cmcdConfigurationFactory)
Java
CmcdConfiguration.FactorycmcdConfigurationFactory=mediaItem->{CmcdConfiguration.RequestConfigcmcdRequestConfig=newCmcdConfiguration.RequestConfig(){@OverridepublicbooleanisKeyAllowed(Stringkey){returnkey.equals("br")||key.equals("bl");}@OverridepublicImmutableListMultimap<@HeaderKeyString,String>getCustomData(){returnImmutableListMultimap.of(CmcdConfiguration.KEY_CMCD_OBJECT,"key1=stringValue");}@OverridepublicintgetRequestedMaximumThroughputKbps(intthroughputKbps){return5*throughputKbps;}};StringsessionId=UUID.randomUUID().toString();StringcontentId=UUID.randomUUID().toString();returnnewCmcdConfiguration(sessionId,contentId,cmcdRequestConfig,MODE_QUERY_PARAMETER);};// Create media source factory and set your custom cmcdConfigurationFactory.MediaSource.FactorymediaSourceFactory=newDefaultMediaSourceFactory(context).setCmcdConfigurationFactory(cmcdConfigurationFactory);
דוגמאות לנתונים של CMCD
הדוגמאות הבאות ממחישות שילובים חוקיים של נתונים שנשלחים בעת אחזור
מקטעי מדיה:
דוגמאות התוכן והקוד שבדף הזה כפופות לרישיונות המפורטים בקטע רישיון לתוכן. Java ו-OpenJDK הם סימנים מסחריים או סימנים מסחריים רשומים של חברת Oracle ו/או של השותפים העצמאיים שלה.
עדכון אחרון: 2025-07-27 (שעון UTC).
[[["התוכן קל להבנה","easyToUnderstand","thumb-up"],["התוכן עזר לי לפתור בעיה","solvedMyProblem","thumb-up"],["סיבה אחרת","otherUp","thumb-up"]],[["חסרים לי מידע או פרטים","missingTheInformationINeed","thumb-down"],["התוכן מורכב מדי או עם יותר מדי שלבים","tooComplicatedTooManySteps","thumb-down"],["התוכן לא עדכני","outOfDate","thumb-down"],["בעיה בתרגום","translationIssue","thumb-down"],["בעיה בדוגמאות/בקוד","samplesCodeIssue","thumb-down"],["סיבה אחרת","otherDown","thumb-down"]],["עדכון אחרון: 2025-07-27 (שעון UTC)."],[],[],null,["# Common Media Client Data (CMCD)\n\nMedia player clients can transmit valuable information to Content Delivery\nNetworks (CDNs) with each object request. Transmitting that data can improve QoS\nmonitoring, adaptive traffic optimization, and delivery performance, ultimately\nenhancing the consumer experience.\n\nThe implementation in ExoPlayer is based on the specification defined in\n[CTA-5004](https://cdn.cta.tech/cta/media/media/resources/standards/pdfs/cta-5004-final.pdf).\n\nCMCD support in Exoplayer\n-------------------------\n\nCMCD support in ExoPlayer can only be enabled for adaptive streaming formats,\nsuch as [DASH](/guide/topics/media/exoplayer/dash), [HLS](/guide/topics/media/exoplayer/hls), and [SmoothStreaming](/guide/topics/media/exoplayer/smoothstreaming).\n\nCMCD data keys\n--------------\n\nCMCD data keys are classified into four distinct types:\n\n- **CMCD-Request**: keys whose values vary with each request.\n- **CMCD-Object**: keys whose values vary with the object being requested.\n- **CMCD-Status**: keys whose values don't vary with every request or object.\n- **CMCD-Session**: keys whose values are expected to be invariant over the life of the session.\n\nModes of transmitting data\n--------------------------\n\nCMCD data can be transmitted using one of two methods:\n\n- As a custom HTTP request header, which is the **default** behaviour.\n- As a HTTP query argument.\n\nEnable CMCD\n-----------\n\nTo enable CMCD, you need to create an instance of `CmcdConfiguration.Factory`\nand pass this to the `MediaSource.Factory` which is [used when building the\nplayer](/guide/topics/media/exoplayer/media-sources#customizing-media-source-creation). You can either use the default `CmcdConfiguration.Factory` or provide\nyour own custom factory which is called each time an adaptive media source is\ncreated for the given media item.\n\n### Enable CMCD with default configuration factory\n\n### Kotlin\n\n```kotlin\n// Create media source factory and set default cmcdConfigurationFactory.\nval mediaSourceFactory =\n DefaultMediaSourceFactory(context)\n .setCmcdConfigurationFactory(CmcdConfiguration.Factory.DEFAULT)\n```\n\n### Java\n\n```java\n// Create media source factory and set default cmcdConfigurationFactory.\nMediaSource.Factory mediaSourceFactory =\n new DefaultMediaSourceFactory(context)\n .setCmcdConfigurationFactory(CmcdConfiguration.Factory.DEFAULT);\n```\n\n\u003cbr /\u003e\n\n| **Note:** When using the default configuration, data is transmitted as custom HTTP request headers.\n\n### Enable CMCD with custom configuration factory\n\n### Kotlin\n\n```kotlin\nval cmcdConfigurationFactory = object : CmcdConfiguration.Factory {\n override fun createCmcdConfiguration(mediaItem: MediaItem): CmcdConfiguration {\n val cmcdRequestConfig = object : CmcdConfiguration.RequestConfig {\n override fun isKeyAllowed(key: String): Boolean {\n return key == \"br\" || key == \"bl\"\n }\n\n override fun getCustomData(): ImmutableListMultimap\u003c@CmcdConfiguration.HeaderKey String, String\u003e {\n return ImmutableListMultimap.of(\n CmcdConfiguration.KEY_CMCD_OBJECT, \"key1=stringValue\")\n }\n\n override fun getRequestedMaximumThroughputKbps(throughputKbps: Int): Int {\n return 5 * throughputKbps\n }\n }\n\n val sessionId = UUID.randomUUID().toString()\n val contentId = UUID.randomUUID().toString()\n\n return CmcdConfiguration(sessionId, contentId, cmcdRequestConfig, MODE_QUERY_PARAMETER)\n }\n}\n\n// Create media source factory and set your custom cmcdConfigurationFactory.\nval mediaSourceFactory =\n DefaultMediaSourceFactory(context)\n .setCmcdConfigurationFactory(cmcdConfigurationFactory)\n```\n\n### Java\n\n```java\nCmcdConfiguration.Factory cmcdConfigurationFactory = mediaItem -\u003e {\n CmcdConfiguration.RequestConfig cmcdRequestConfig = new CmcdConfiguration.RequestConfig() {\n @Override\n public boolean isKeyAllowed(String key) {\n return key.equals(\"br\") || key.equals(\"bl\");\n }\n\n @Override\n public ImmutableListMultimap\u003c@HeaderKey String, String\u003e getCustomData() {\n return ImmutableListMultimap.of(\n CmcdConfiguration.KEY_CMCD_OBJECT, \"key1=stringValue\");\n }\n\n @Override\n public int getRequestedMaximumThroughputKbps(int throughputKbps) {\n return 5 * throughputKbps;\n }\n };\n\n String sessionId = UUID.randomUUID().toString();\n String contentId = UUID.randomUUID().toString();\n\n return new CmcdConfiguration(sessionId, contentId, cmcdRequestConfig, MODE_QUERY_PARAMETER);\n};\n\n// Create media source factory and set your custom cmcdConfigurationFactory.\nMediaSource.Factory mediaSourceFactory =\n new DefaultMediaSourceFactory(context)\n .setCmcdConfigurationFactory(cmcdConfigurationFactory);\n```\n\n\u003cbr /\u003e\n\n| **Note:** When utilising a custom configuration, you have the option to transmit data as custom request headers (`MODE_REQUEST_HEADER`) or as query parameters (`MODE_QUERY_PARAMETER`).\n\nCMCD data examples\n------------------\n\nThese examples illustrate valid data combinations of data sent when fetching\nmedia chunks:\n\n- As custom HTTP request headers\n\n CMCD-Session:sid=\"6e2fb550-c457-11e9-bb97-0800200c9a66\"\n\n CMCD-Request:mtp=25400 CMCD-Object:br=3200,d=4004,ot=v,tb=6000\n CMCD-Status:bs,rtp=15000\n CMCD-Session:sid=\"6e2fb550-c457-11e9-bb97-0800200c9a66\"\n\n- As HTTP query arguments\n\n ?CMCD=sid%3D%226e2fb550-c457-11e9-bb97-0800200c9a66%22\n\n ?CMCD=br%3D3200%2Cbs%2Cd%3D4004%2Cmtp%3D25400%2Cot%3Dv%2Crtp\n %3D15000%2Csid%3D%226e2fb550-c457-11e9-bb97-\n 0800200c9a66%22%2Ctb%3D6000"]]