נתוני לקוחות מדיה נפוצים (CMCD)

לקוחות של נגני מדיה יכולים להעביר מידע חשוב לרשתות להעברת תוכן (CDN) עם כל בקשת אובייקט. העברת הנתונים האלה יכולה לשפר את המעקב אחר איכות השירות (QoS), את האופטימיזציה של התנועה ואת ביצועי המסירה, ובסופו של דבר לשפר את חוויית הצרכן.

ההטמעה ב-ExoPlayer מבוססת על המפרט שמוגדר ב-CTA-5004.

תמיכה ב-CMCD ב-ExoPlayer

אפשר להפעיל תמיכה ב-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.
val mediaSourceFactory =
  DefaultMediaSourceFactory(context)
    .setCmcdConfigurationFactory(CmcdConfiguration.Factory.DEFAULT)

Java

// Create media source factory and set default cmcdConfigurationFactory.
MediaSource.Factory mediaSourceFactory =
    new DefaultMediaSourceFactory(context)
        .setCmcdConfigurationFactory(CmcdConfiguration.Factory.DEFAULT);

הפעלת CMCD באמצעות הגדרות ברירת מחדל מותאמות אישית

Kotlin

val cmcdConfigurationFactory =
  object : CmcdConfiguration.Factory {
    override fun createCmcdConfiguration(mediaItem: MediaItem): CmcdConfiguration {
      val cmcdRequestConfig =
        object : CmcdConfiguration.RequestConfig {
          override fun isKeyAllowed(key: String): Boolean {
            return key == "br" || key == "bl"
          }

          override fun getCustomData():
            ImmutableListMultimap<@CmcdConfiguration.HeaderKey String, String> {
            return ImmutableListMultimap.of(
              CmcdConfiguration.KEY_CMCD_OBJECT,
              "key1=stringValue",
            )
          }

          override fun getRequestedMaximumThroughputKbps(throughputKbps: Int): Int {
            return 5 * throughputKbps
          }
        }

      val sessionId = UUID.randomUUID().toString()
      val contentId = UUID.randomUUID().toString()

      return CmcdConfiguration(sessionId, contentId, cmcdRequestConfig, MODE_QUERY_PARAMETER)
    }
  }

// Create media source factory and set your custom cmcdConfigurationFactory.
val mediaSourceFactory =
  DefaultMediaSourceFactory(context).setCmcdConfigurationFactory(cmcdConfigurationFactory)

Java

CmcdConfiguration.Factory cmcdConfigurationFactory =
    mediaItem -> {
      CmcdConfiguration.RequestConfig cmcdRequestConfig =
          new CmcdConfiguration.RequestConfig() {
            @Override
            public boolean isKeyAllowed(String key) {
              return key.equals("br") || key.equals("bl");
            }

            @Override
            public ImmutableListMultimap<@HeaderKey String, String> getCustomData() {
              return ImmutableListMultimap.of(
                  CmcdConfiguration.KEY_CMCD_OBJECT, "key1=stringValue");
            }

            @Override
            public int getRequestedMaximumThroughputKbps(int throughputKbps) {
              return 5 * throughputKbps;
            }
          };

      String sessionId = UUID.randomUUID().toString();
      String contentId = UUID.randomUUID().toString();

      return new CmcdConfiguration(
          sessionId, contentId, cmcdRequestConfig, MODE_QUERY_PARAMETER);
    };

// Create media source factory and set your custom cmcdConfigurationFactory.
MediaSource.Factory mediaSourceFactory =
    new DefaultMediaSourceFactory(context)
        .setCmcdConfigurationFactory(cmcdConfigurationFactory);

דוגמאות לנתוני CMCD

בדוגמאות האלה מוצגים שילובים תקינים של נתונים שנשלחים כשמאחזרים נתחי מדיה:

  • ככותרות מותאמות אישית של בקשת HTTP

       CMCD-Session:sid="6e2fb550-c457-11e9-bb97-0800200c9a66"
    
       CMCD-Request:mtp=25400 CMCD-Object:br=3200,d=4004,ot=v,tb=6000
       CMCD-Status:bs,rtp=15000
       CMCD-Session:sid="6e2fb550-c457-11e9-bb97-0800200c9a66"
    
  • כארגומנטים של שאילתת HTTP

       ?CMCD=sid%3D%226e2fb550-c457-11e9-bb97-0800200c9a66%22
    
       ?CMCD=br%3D3200%2Cbs%2Cd%3D4004%2Cmtp%3D25400%2Cot%3Dv%2Crtp
       %3D15000%2Csid%3D%226e2fb550-c457-11e9-bb97-
       0800200c9a66%22%2Ctb%3D6000