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-এর পূর্বের সংস্করণগুলির জন্য , উপরের কলটি এমন একটি বস্তু ফেরত দেবে যার ক্ষেত্রগুলি অনির্ধারিত, তাই আপনাকে ব্যবহারকারীর নির্বাচন এবং কিছু ডিফল্ট মানগুলির উপর ভিত্তি করে আপনার অ্যাপে সেই ক্ষেত্রগুলি পূরণ করতে হবে৷ আপনি নিম্নলিখিত পাঠ্য ট্র্যাক শৈলী উপাদান স্টাইল করতে পারেন:
- ফোরগ্রাউন্ড (টেক্সট) রঙ এবং অস্বচ্ছতা
- পটভূমির রঙ এবং অস্বচ্ছতা
- প্রান্ত প্রকার
- প্রান্ত রঙ
- ফন্ট স্কেল
- ফন্ট পরিবার
- ফন্ট স্টাইল
উদাহরণস্বরূপ, নিম্নরূপ 50% অস্বচ্ছতা (80) সহ পাঠ্যের রঙ লাল (FF) এ সেট করুন:
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 মিডিয়া স্ট্রিমগুলিতে ট্র্যাক অন্তর্ভুক্ত থাকলে CORS প্রয়োজন। আপনি যদি কোনও মিডিয়ার জন্য ট্র্যাকগুলি সক্ষম করতে চান তবে আপনাকে অবশ্যই আপনার ট্র্যাক স্ট্রীম এবং আপনার মিডিয়া স্ট্রিম উভয়ের জন্য CORS সক্ষম করতে হবে৷ সুতরাং, যদি আপনার সার্ভারে আপনার সাধারণ mp4 মিডিয়ার জন্য CORS শিরোনাম উপলব্ধ না থাকে এবং আপনি একটি সাধারণ সাবটাইটেল ট্র্যাক যোগ করেন, তাহলে আপনি আপনার মিডিয়া স্ট্রিম করতে পারবেন না যতক্ষণ না আপনি উপযুক্ত CORS হেডার অন্তর্ভুক্ত করার জন্য আপনার সার্ভার আপডেট করেন। উপরন্তু, আপনাকে কমপক্ষে নিম্নলিখিত শিরোনামগুলির অনুমতি দিতে হবে: বিষয়বস্তু-প্রকার, স্বীকার-এনকোডিং এবং পরিসর। মনে রাখবেন যে শেষ দুটি শিরোনাম অতিরিক্ত শিরোনাম যা আপনার আগে প্রয়োজন ছিল না।