MediaTrack
یک آهنگ رسانه ای را نشان می دهد که می تواند یک جریان صوتی، یک جریان ویدئو یا متن (مانند زیرنویس یا زیرنویس) باشد. برنامه شما می تواند آهنگ های رسانه را گروه بندی، سبک و فعال کند.
یک آهنگ را پیکربندی کنید
می توانید یک آهنگ را پیکربندی کنید و یک شناسه منحصر به فرد به آن اختصاص دهید. کد زیر یک تراک متن انگلیسی، یک تراک متنی فرانسوی و یک آهنگ صوتی فرانسوی ایجاد می کند که هر کدام دارای شناسه خاص خود هستند:
val englishSubtitle = MediaTrack.Builder(1 /* ID */, MediaTrack.TYPE_TEXT) .setName("English Subtitle") .setSubtype(MediaTrack.SUBTYPE_SUBTITLES) .setContentId("https://some-url/caption_en.vtt") /* language is required for subtitle type but optional otherwise */ .setLanguage("en-US") .build() val frenchSubtitle = MediaTrack.Builder(2, MediaTrack.TYPE_TEXT) .setName("French Subtitle") .setSubtype(MediaTrack.SUBTYPE_SUBTITLES) .setContentId("https://some-url/caption_fr.vtt") .setLanguage("fr") .build() val frenchAudio = MediaTrack.Builder(3, MediaTrack.TYPE_AUDIO) .setName("French Audio") .setContentId("trk0001") .setLanguage("fr") .build()
MediaTrack englishSubtitle = new MediaTrack.Builder(1 /* ID */, MediaTrack.TYPE_TEXT) .setName("English Subtitle") .setSubtype(MediaTrack.SUBTYPE_SUBTITLES) .setContentId("https://some-url/caption_en.vtt") /* language is required for subtitle type but optional otherwise */ .setLanguage("en-US") .build(); MediaTrack frenchSubtitle = new MediaTrack.Builder(2, MediaTrack.TYPE_TEXT) .setName("French Subtitle") .setSubtype(MediaTrack.SUBTYPE_SUBTITLES) .setContentId("https://some-url/caption_fr.vtt") .setLanguage("fr") .build(); MediaTrack frenchAudio = new MediaTrack.Builder(3, MediaTrack.TYPE_AUDIO) .setName("French Audio") .setContentId("trk0001") .setLanguage("fr") .build();
آهنگ های گروهی
میتوانید چندین آهنگ را در یک آیتم رسانه گروهبندی کنید که توسط MediaInfo
نشان داده میشود. نمونهای از MediaInfo
مجموعهای از آهنگها را میگیرد و سایر اطلاعات را درباره آیتم رسانه جمعآوری میکند. بر اساس مثال، برنامه شما میتواند با ارسال فهرستی از آن سه آهنگ به MediaInfo.Builder.setMediaTracks(List)
آن سه آهنگ رسانه را به یک آیتم رسانه اضافه کند. برنامه شما باید قبل از بارگیری رسانه در گیرنده، آهنگهای MediaInfo
را به این روش مرتبط کند.
val tracks: MutableList<MediaTrack> = ArrayList<MediaTrack>() tracks.add(englishSubtitle) tracks.add(frenchSubtitle) tracks.add(frenchAudio) val mediaInfo = MediaInfo.Builder(url) .setStreamType(MediaInfo.STREAM_TYPE_BUFFERED) .setContentType(getContentType()) .setMetadata(getMetadata()) .setMediaTracks(tracks) .build()
List tracks = new ArrayList(); tracks.add(englishSubtitle); tracks.add(frenchSubtitle); tracks.add(frenchAudio); MediaInfo mediaInfo = MediaInfo.Builder(url) .setStreamType(MediaInfo.STREAM_TYPE_BUFFERED) .setContentType(getContentType()) .setMetadata(getMetadata()) .setMediaTracks(tracks) .build();
حذف آهنگ ها
برای حذف تمام آهنگ ها از رسانه فعلی (مانند خاموش کردن سه زیرنویس در مثال)، MediaInfo.Builder.setMediaTracks(List)
را فراخوانی کنید و یک لیست خالی از شناسه ها را ارسال کنید.
آهنگ ها را به روز کنید
برنامه شما میتواند با تماس RemoteMediaClient.setActiveMediaTracks(long[])
یک یا چند آهنگ مرتبط با آیتم رسانه (پس از بارگیری رسانه) و ارسال شناسههای آهنگهایی که قرار است فعال شوند، فعال کند. این مثال زیرنویس فرانسوی و صدای فرانسوی را فعال می کند:
// the ID for the French subtitle is '2' and for the French audio '3' remoteMediaClient.setActiveMediaTracks(longArrayOf(2, 3)) .setResultCallback(ResultCallback { mediaChannelResult: RemoteMediaClient.MediaChannelResult -> if (!mediaChannelResult.status.isSuccess) { Log.e(TAG, "Failed with status code:" + mediaChannelResult.status.statusCode ) } })
// the ID for the French subtitle is '2' and for the French audio '3' remoteMediaClient.setActiveMediaTracks(new long[]{2, 3}) .setResultCallback(mediaChannelResult -> { if (!mediaChannelResult.getStatus().isSuccess()) { Log.e(TAG, "Failed with status code:" + mediaChannelResult.getStatus().getStatusCode()); } });
سبک آهنگ های متنی
TextTrackStyle
اطلاعات استایل یک آهنگ متنی را در بر می گیرد. پس از ایجاد یا بهروزرسانی یک TextTrackStyle موجود، میتوانید با فراخوانی RemoteMediaClient.setTextTrackStyle
، آن سبک را روی آیتم رسانهای در حال پخش اعمال کنید:
// the ID for the French subtitle is '2' and for the French audio '3' remoteMediaClient.setTextTrackStyle(style) .setResultCallback(ResultCallback { mediaChannelResult: RemoteMediaClient.MediaChannelResult -> if (!mediaChannelResult.status.isSuccess) { Log.e(TAG, "Failed to set the style, status code: " + mediaChannelResult.status.statusCode ) } })
remoteMediaClient.setTextTrackStyle(style) .setResultCallback(mediaChannelResult -> { if (!mediaChannelResult.getStatus().isSuccess()) { Log.e(TAG, "Failed to set the style, status code: " + mediaChannelResult.getStatus().getStatusCode()); } });
برنامه شما باید به کاربران اجازه دهد تا سبک آهنگ های متنی را با استفاده از تنظیمات ارائه شده توسط سیستم یا خود برنامه به روز کنند. در Android KitKat و نسخههای جدیدتر ، میتوانید از تنظیمات زیرنویس در سراسر سیستم که توسط چارچوب ارائه شده است استفاده کنید:
val textTrackStyle = TextTrackStyle.fromSystemSettings(context)
TextTrackStyle textTrackStyle = TextTrackStyle.fromSystemSettings(context);
برای نسخههای قبل از KitKat ، فراخوانی بالا یک شی را برمیگرداند که فیلدهای آن تعریف نشده است، بنابراین باید آن فیلدها را بر اساس انتخابهای کاربر و برخی مقادیر پیشفرض در برنامه خود پر کنید. می توانید عناصر سبک آهنگ متن زیر را استایل دهید:
- رنگ و تیرگی پیش زمینه (متن).
- رنگ پس زمینه و شفافیت
- نوع لبه
- رنگ لبه
- مقیاس قلم
- خانواده فونت
- سبک قلم
به عنوان مثال، رنگ متن را قرمز (FF) با کدورت 50٪ (80) به صورت زیر تنظیم کنید:
textTrackStyle.foregroundColor = Color.parseColor("#80FF0000")
textTrackStyle.setForegroundColor(Color.parseColor("#80FF0000"));
در KitKat و نسخههای بعدی ، باید برنامه خود را ثبت کنید تا در صورت بهروزرسانی تنظیمات زیرنویس در سراسر سیستم، مطلع شوید. برای این منظور، باید CaptioningManager.CaptioningChangeListener
در برنامه خود پیاده سازی کنید و با تماس این شنونده را ثبت کنید:
CaptioningManager.addCaptioningChangeListener(yourChangeListener)
CaptioningManager.addCaptioningChangeListener(yourChangeListener);
هنگامی که برنامه شما پاسخی دریافت میکند که تنظیمات زیرنویس تغییر کردهاند، باید تنظیمات جدید را استخراج کنید و با تماس با RemoteMediaClient.setTextTrackStyle
و ارسال سبک جدید، سبک عنوان متن را برای رسانهای که در حال پخش است، بهروزرسانی کنید.
به روز رسانی وضعیت را دریافت کنید
هنگامی که چندین فرستنده به یک گیرنده متصل هستند، برای هر فرستنده مهم است که از تغییرات گیرنده آگاه باشد حتی اگر این تغییرات از فرستنده های دیگر آغاز شده باشد.
برای این منظور، برنامه شما باید یک RemoteMediaClient.Listener
و یک RemoteMediaClient.ProgressListener
ثبت کند.
اگر TextTrackStyle
رسانه فعلی تغییر کند، آنگاه به همه فرستندههای متصل از طریق هر دو شنونده ثبتشده فوق اطلاع داده میشود. در این حالت، SDK گیرنده بررسی نمیکند که آیا سبک جدید با سبک قبلی متفاوت است یا خیر و بدون توجه به آن، به همه فرستندههای متصل اطلاع میدهد. با این حال، اگر وضعیت آهنگهای فعال تغییر کند، فقط RemoteMediaClient.ProgressListener
در فرستندههای متصل مطلع خواهد شد.
الزامات CORS را برآورده کنید
برای پخش جریانی رسانه تطبیقی، Google Cast به وجود سرصفحههای CORS نیاز دارد، اما حتی جریانهای رسانه mp4 ساده نیز اگر شامل Tracks باشند، به CORS نیاز دارند. اگر میخواهید آهنگها را برای هر رسانهای فعال کنید، باید CORS را هم برای جریانهای آهنگ و هم برای پخشهای رسانهای فعال کنید. بنابراین، اگر هدرهای CORS را برای رسانه mp4 ساده خود روی سرور خود ندارید، و سپس یک آهنگ زیرنویس ساده اضافه میکنید، نمیتوانید رسانه خود را پخش کنید، مگر اینکه سرور خود را بهروزرسانی کنید تا هدر CORS مناسب را درج کند. علاوه بر این، باید حداقل هدرهای زیر را مجاز کنید: Content-Type، Accept-Encoding و Range. توجه داشته باشید که دو هدر آخر سرصفحه های اضافی هستند که ممکن است قبلاً به آنها نیاز نداشته باشید.