استخدام مسارات الوسائط

يمكن أن يكون مسار الوسائط عبارة عن عنصر بث صوت أو فيديو أو عنصر نصي (ترجمة أو شرح).

يمثل الكائن GCKMediaTrack مسارًا. وهو يتألف من معرّف رقمي فريد وسمات أخرى مثل معرّف المحتوى والعنوان. يمكن إنشاء مثيل GCKMediaTrack على النحو التالي:

تطبيق Swift
let captionsTrack = GCKMediaTrack.init(identifier: 1,
                                       contentIdentifier: "https://some-url/caption_en.vtt",
                                       contentType: "text/vtt",
                                       type: GCKMediaTrackType.text,
                                       textSubtype: GCKMediaTextTrackSubtype.captions,
                                       name: "English Captions",
                                       languageCode: "en",
                                       customData: nil)
الهدف ج
GCKMediaTrack *captionsTrack =
      [[GCKMediaTrack alloc] initWithIdentifier:1
                              contentIdentifier:@"https://some-url/caption_en.vtt"
                                    contentType:@"text/vtt"
                                           type:GCKMediaTrackTypeText
                                    textSubtype:GCKMediaTextTrackSubtypeCaptions
                                           name:@"English Captions"
                                   languageCode:@"en"
                                     customData:nil];

ويمكن أن يشتمل عنصر الوسائط على مقاطع صوتية متعددة، على سبيل المثال، يمكن أن يشتمل على عدة عناوين فرعية (كل منها بلغة مختلفة) أو عدة عمليات بث صوتية بديلة (للغات مختلفة). GCKMediaInformation هي الفئة التي تمثّل عنصر وسائط. لربط مجموعة من عناصر GCKMediaTrack بعنصر وسائط، يجب أن يعدّل تطبيقك سمة mediaTracks. يحتاج تطبيقك إلى إجراء هذا الاقتران قبل تحميل الوسائط إلى المتلقي، كما هو الحال في التعليمة البرمجية التالية:

تطبيق Swift
let tracks = [captionsTrack]

let url = URL.init(string: "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4")
guard let mediaURL = url else {
  print("invalid mediaURL")
  return
}

let mediaInfoBuilder = GCKMediaInformationBuilder.init(contentURL: mediaURL)
mediaInfoBuilder.streamType = GCKMediaStreamType.none;
mediaInfoBuilder.contentType = "video/mp4"
mediaInfoBuilder.metadata = metadata;
mediaInfoBuilder.mediaTracks = tracks;
mediaInformation = mediaInfoBuilder.build()
الهدف ج
NSArray *tracks = @[captionsTrack];

GCKMediaInformationBuilder *mediaInfoBuilder =
  [[GCKMediaInformationBuilder alloc] initWithContentURL:
   [NSURL URLWithString:@"https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4"]];
mediaInfoBuilder.streamType = GCKMediaStreamTypeNone;
mediaInfoBuilder.contentType = @"video/mp4";
mediaInfoBuilder.metadata = metadata;
mediaInfoBuilder.mediaTracks = tracks;
self.mediaInformation = [mediaInfoBuilder build];

تفعيل مسار واحد أو أكثر كان مرتبطًا بعنصر الوسائط (بعد تحميل الوسائط) من خلال استدعاء -[setActiveTrackIDs:] على GCKRemoteMediaClient وتمرير معرّفات المسارات المطلوب تفعيلها. على سبيل المثال، يؤدي الكود التالي إلى تنشيط مسار التسميات التوضيحية الذي تم إنشاؤه أعلاه.

تطبيق Swift
sessionManager.currentSession?.remoteMediaClient?.setActiveTrackIDs([1])
الهدف ج
[self.sessionManager.currentSession.remoteMediaClient setActiveTrackIDs:@[@1]];

لإيقاف مقطع صوتي في عنصر الوسائط الحالي، يمكنك استدعاء -[setActiveTrackIDs:] على GCKRemoteMediaClient باستخدام مصفوفة فارغة أو صفر. يؤدي الرمز التالي إلى إيقاف مسار التسميات التوضيحية.

تطبيق Swift
sessionManager.currentSession?.remoteMediaClient?.setActiveTrackIDs([])
الهدف ج
[self.sessionManager.currentSession.remoteMediaClient setActiveTrackIDs:@[]];

تحديد نمط مسارات النص

تتضمن فئة GCKMediaTextTrackStyle معلومات نمط مسار نصي. يمكن تطبيق نمط المقطع الصوتي على عنصر الوسائط الذي يتم تشغيله حاليًا من خلال استدعاء -[GCKRemoteMediaClient setTextTrackStyle]. يتحول نمط المسار الذي تم إنشاؤه في التعليمة البرمجية أدناه إلى النص الأحمر (FF) بدرجة تعتيم 50٪ (80) ويعين خط serif.

تطبيق Swift
let textTrackStyle = GCKMediaTextTrackStyle.createDefault()
textTrackStyle.foregroundColor = GCKColor.init(cssString: "#FF000080")
textTrackStyle.fontFamily = "serif"
styleChangeRequest = sessionManager.currentSession?.remoteMediaClient?.setTextTrackStyle(textTrackStyle)
styleChangeRequest?.delegate = self
الهدف ج
GCKMediaTextTrackStyle *textTrackStyle = [GCKMediaTextTrackStyle createDefault];
[textTrackStyle setForegroundColor:[[GCKColor alloc] initWithCSSString:@"#FF000080"]];
[textTrackStyle setFontFamily:@"serif"];
self.styleChangeRequest = [self.sessionManager.currentSession.remoteMediaClient setTextTrackStyle:textTrackStyle];
self.styleChangeRequest.delegate = self;

يمكنك استخدام الكائن GCKRequest المعروض لتتبُّع هذا الطلب.

تطبيق Swift
// MARK: - GCKRequestDelegate

func requestDidComplete(_ request: GCKRequest) {
  if request == styleChangeRequest {
    print("Style update completed.")
    styleChangeRequest = nil
  }
}
الهدف ج
#pragma mark - GCKRequestDelegate

- (void)requestDidComplete:(GCKRequest *)request {
  if (request == self.styleChangeRequest) {
    NSLog(@"Style update completed.");
    self.styleChangeRequest = nil;
  }
}

يمكنك الاطّلاع على تحديثات الحالة أدناه للحصول على مزيد من المعلومات. يجب أن تسمح التطبيقات للمستخدمين بتعديل نمط مسارات النص، إما باستخدام الإعدادات التي يوفرها النظام أو بواسطة التطبيق نفسه. يتوفر نمط تلقائي (في iOS 7 والإصدارات الأحدث) يمكن استرداده من خلال الطريقة الثابتة +[GCKMediaTextTrackStyle createDefault]. يمكن تغيير عناصر نمط مسار النص التالية:

  • لون المقدمة (النص) ودرجة التعتيم
  • لون الخلفية ودرجة التعتيم
  • نوع الحافة
  • لون الحافة
  • مقياس الخط
  • مجموعة الخطوط
  • نمط الخط

تلقّي تحديثات الحالة

عند اتصال عدة مرسلين بالمستلم نفسه، من المهم أن يكون كل مرسل على دراية بالتغييرات التي تطرأ على المستلم حتى إذا كانت هذه التغييرات قد بدأت من مرسلين آخرين.

لضمان تلقّي المُرسِل تحديثات الحالة من المُستلِم، يجب أن يسجِّل تطبيقك GCKRemoteMediaClientListener. في حال تغيير GCKMediaTextTrackStyle الوسائط الحالية، سيتم إشعار كل المُرسِلين المرتبطين من خلال كلٍّ من رد الاتصال -[remoteMediaClient:didUpdateMediaMetadata:] و -[remoteMediaClient:didUpdateMediaStatus:]. في هذه الحالة، لن تتحقّق حزمة تطوير البرامج (SDK) لجهاز الاستقبال مما إذا كان النمط الجديد مختلفًا عن النمط السابق، وستنبّه جميع المُرسِلين المرتبطين بغض النظر عن ذلك. ومع ذلك، إذا تم تعديل قائمة المسارات النشطة، سيتم فقط إشعار -[remoteMediaClient:didUpdateMediaStatus:] في المرسِلين المرتبطين.

استيفاء متطلبات CORS

بالنسبة إلى بث الوسائط التكيُّفي، يتطلّب Google Cast توفُّر عناوين CORS، ولكن حتى أحداث بث وسائط mp4 البسيطة تتطلب سياسة CORS إذا كانت تتضمن مقاطع صوتية. إذا كنت تريد تفعيل المقاطع الصوتية لأي وسائط، يجب تفعيل سياسة CORS لكل من مجموعات بث المقاطع الصوتية وأحداث بث الوسائط. لذا، إذا لم تتوفّر لديك رؤوس CORS لوسائط mp4 البسيطة على الخادم، وأضفت مسار ترجمة بسيطًا للعنوان الفرعي، لن تتمكّن من بث الوسائط ما لم تحدّث الخادم لتضمين رأس CORS المناسب. بالإضافة إلى ذلك، تحتاج إلى السماح بالعناوين التالية على الأقل: نوع المحتوى وقبول-الترميز، والنطاق. لاحظ أن العنوانين الأخيرين هما عناوين إضافية ربما لم تكن بحاجة إليها من قبل.