يمكن أن يكون مسار الوسائط عبارة عن عنصر بث صوت أو فيديو أو عنصر نصي (ترجمة أو شرح).
يمثل الكائن GCKMediaTrack
مسارًا. وهو يتألف من معرّف رقمي فريد وسمات أخرى مثل معرّف المحتوى والعنوان. يمكن إنشاء مثيل GCKMediaTrack
على النحو التالي:
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
. يحتاج تطبيقك إلى إجراء هذا الاقتران قبل تحميل
الوسائط إلى المتلقي، كما هو الحال في التعليمة البرمجية التالية:
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
وتمرير معرّفات المسارات المطلوب تفعيلها. على سبيل المثال، يؤدي الكود التالي إلى
تنشيط مسار التسميات التوضيحية الذي تم إنشاؤه أعلاه.
sessionManager.currentSession?.remoteMediaClient?.setActiveTrackIDs([1])
[self.sessionManager.currentSession.remoteMediaClient setActiveTrackIDs:@[@1]];
لإيقاف مقطع صوتي في عنصر الوسائط الحالي، يمكنك استدعاء
-[setActiveTrackIDs:]
على
GCKRemoteMediaClient
باستخدام مصفوفة فارغة أو صفر. يؤدي الرمز التالي إلى إيقاف مسار التسميات التوضيحية.
sessionManager.currentSession?.remoteMediaClient?.setActiveTrackIDs([])
[self.sessionManager.currentSession.remoteMediaClient setActiveTrackIDs:@[]];
تحديد نمط مسارات النص
تتضمن فئة GCKMediaTextTrackStyle
معلومات نمط مسار نصي. يمكن تطبيق نمط المقطع الصوتي
على عنصر الوسائط الذي يتم تشغيله حاليًا من خلال استدعاء
-[GCKRemoteMediaClient
setTextTrackStyle]
.
يتحول نمط المسار الذي تم إنشاؤه في التعليمة البرمجية أدناه إلى النص الأحمر (FF) بدرجة تعتيم 50٪ (80) ويعين خط serif.
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
المعروض
لتتبُّع هذا الطلب.
// 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 المناسب. بالإضافة إلى ذلك، تحتاج إلى السماح بالعناوين التالية على الأقل: نوع المحتوى وقبول-الترميز، والنطاق. لاحظ أن العنوانين الأخيرين هما عناوين إضافية ربما لم تكن بحاجة إليها من قبل.