استفاده از قطعه‌های رسانه

قطعه رسانه می‌تواند یک شیء جاری‌سازی صوتی یا ویدیویی، یا یک شیء نوشتاری (زیرنویس یا زیرنویس ناشنوایان) باشد.

یک شیء 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)
Objective-C
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()
Objective-C
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])
Objective-C
[self.sessionManager.currentSession.remoteMediaClient setActiveTrackIDs:@[@1]];

برای غیرفعال کردن یک قطعه در عنصر رسانه‌ای فعلی، -[setActiveTrackIDs:] را در GCKRemoteMediaClient با آرایه خالی یا nil فراخوانی کنید. کد زیر قطعه زیرنویس ناشنوایان را غیرفعال می‌کند.

Swift
sessionManager.currentSession?.remoteMediaClient?.setActiveTrackIDs([])
Objective-C
[self.sessionManager.currentSession.remoteMediaClient setActiveTrackIDs:@[]];

سبک‌بندی قطعه‌های نوشتار

کلاس GCKMediaTextTrackStyle اطلاعات سبک قطعه نوشتاری را دربرمی‌گیرد. سبک قطعه را می‌توان با فراخوانی -[GCKRemoteMediaClient setTextTrackStyle] روی عنصر رسانه‌ای درحال پخش اعمال کرد. سبک قطعه ایجادشده در کد زیر نوشتار را در کدورت ۵۰٪ (۸۰) قرمز (FF) می‌کند و قلم سن‌سریف تنظیم می‌کند.

Swift
let textTrackStyle = GCKMediaTextTrackStyle.createDefault()
textTrackStyle.foregroundColor = GCKColor.init(cssString: "#FF000080")
textTrackStyle.fontFamily = "serif"
styleChangeRequest = sessionManager.currentSession?.remoteMediaClient?.setTextTrackStyle(textTrackStyle)
styleChangeRequest?.delegate = self
Objective-C
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
  }
}
Objective-C
#pragma mark - GCKRequestDelegate

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

برای اطلاعات بیشتر، به‌روزرسانی‌های وضعیت در زیر را ببینید. برنامه‌ها باید به کاربران اجازه دهند سبک قطعه‌های نوشتاری را به‌روز کنند، چه بااستفاده از تنظیمات ارائه‌شده توسط سیستم یا خود برنامه. سبک پیش‌فرضی ارائه شده است که می‌توان آن را ازطریق روش ایستا +[GCKMediaTextTrackStyle createDefault] بازیابی کرد. عناصر سبک قطعه نوشتاری زیر را می‌توان تغییر داد:

  • رنگ و ماتی پیش‌زمینه (نوشتار)
  • رنگ و ماتی پس‌زمینه
  • نوع لبه
  • رنگ لبه
  • مقیاس قلم
  • خانواده قلم
  • سبک قلم

دریافت به‌روزرسانی‌های وضعیت

وقتی چند فرستنده به یک گیرنده متصل می‌شوند، مهم است که هر فرستنده از تغییرات گیرنده مطلع باشد، حتی اگر این تغییرات ازسوی فرستنده‌های دیگر آغاز شده باشد.

برای اینکه مطمئن شوید فرستنده از گیرنده به‌روزرسانی‌های وضعیت دریافت می‌کند، برنامه شما باید GCKRemoteMediaClientListener را ثبت کند. اگر GCKMediaTextTrackStyle رسانه فعلی تغییر کند، همه فرستندگان متصل ازطریق هر دو -[remoteMediaClient:didUpdateMediaMetadata:] و -[remoteMediaClient:didUpdateMediaStatus:] پاسخ‌برگ مطلع خواهند شد. در این مورد، «کیت توسعه نرم‌افزار گیرنده» بررسی نمی‌کند که آیا سبک جدید با سبک قبلی متفاوت است یا نه و درهرصورت به همه فرستنده‌های متصل اطلاع می‌دهد. بااین‌حال، اگر فهرست دسته‌های هدف فعال به‌روز شود، فقط -[remoteMediaClient:didUpdateMediaStatus:] در فرستندگان متصل مطلع خواهند شد.

الزامات CORS را برآورده کنید

برای جاری‌سازی رسانه تطبیقی، Google Cast به وجود سرایندهای CORS نیاز دارد، اما حتی جاری‌سازی‌های رسانه mp4 ساده نیز اگر شامل «قطعه‌ها» باشند به CORS نیاز دارند. اگر می‌خواهید «دسته‌ها» را برای هر رسانه‌ای فعال کنید، باید CORS را هم برای جاری‌سازی‌های دسته و هم برای جاری‌سازی‌های رسانه فعال کنید. بنابراین، اگر سرصفحه‌های CORS برای رسانه mp4 ساده خود در سرورتان دردسترس ندارید و سپس یک قطعه زیرنویس ساده اضافه می‌کنید، نمی‌توانید رسانه‌تان را جاری‌سازی کنید، مگر اینکه سرورتان را به‌روزرسانی کنید تا سرصفحه CORS مناسب را اضافه کند. علاوه‌براین، باید حداقل سرصفحه‌های زیر را مجاز کنید: Content-Type،‏ Accept-Encoding، و Range. توجه داشته باشید که دو سرصفحه آخر، سرصفحه‌های اضافی هستند که ممکن است قبلاً به آن‌ها نیاز نداشته‌اید.