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

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

ضبط إعدادات المقطع الصوتي

يمكنك إعداد مقطع صوتي وتخصيص معرّف فريد له. يُنشئ الكود التالي تنشئ مسارًا نصيًا باللغة الإنجليزية ومسارًا نصيًا باللغة الفرنسية ومقطعًا صوتيًا باللغة الفرنسية، ولكلٍّ منها معرّف خاص به:

Kotlin
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()
Java
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 بهذه الطريقة قبل أن يتم تحميله. الوسائط إلى المتلقي.

Kotlin
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()
Java
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[]) وتمرير معرفات المسارات المراد تفعيلها. ينشط هذا المثال الترجمة إلى اللغة الفرنسية والصوت:

Kotlin
// 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
                    )
                }
    })
Java
// 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، النحو التالي:

Kotlin
// 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
                    )
                }
    })
Java
remoteMediaClient.setTextTrackStyle(style)
    .setResultCallback(mediaChannelResult -> {
        if (!mediaChannelResult.getStatus().isSuccess()) {
            Log.e(TAG, "Failed to set the style, status code: " +
                    mediaChannelResult.getStatus().getStatusCode());
        }
    });

يجب أن يسمح تطبيقك للمستخدمين بتعديل نمط المسارات النصية، سواء باستخدام الإعدادات التي يوفرها النظام أو التطبيق نفسه. في Android KitKat والإصدارات الأحدث، يمكنك استخدام إعدادات الترجمة والشرح على مستوى النظام التي توفّرها إطار العمل:

Kotlin
val textTrackStyle = TextTrackStyle.fromSystemSettings(context)
Java
TextTrackStyle textTrackStyle = TextTrackStyle.fromSystemSettings(context);

في الإصدارات السابقة على إصدار KitKat، سيعرض الاستدعاء أعلاه كائنًا غير محددة، لذا تحتاج إلى ملء هذه الحقول في تطبيقك، بناءً على اختيارات المستخدمين وبعض القيم الافتراضية. يمكنك تصميم نمط النص التالي عناصر نمط التتبع:

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

مثلاً، يمكنك ضبط لون النص على اللون الأحمر (FF) بدرجة تعتيم 50% (80) على النحو التالي:

Kotlin
textTrackStyle.foregroundColor = Color.parseColor("#80FF0000")
Java
textTrackStyle.setForegroundColor(Color.parseColor("#80FF0000"));

في إصدار KitKat والإصدارات الأحدث، عليك تسجيل تطبيقك ليتم إشعارك عند تحديث إعدادات الترجمة والشرح على مستوى النظام لتحقيق هذه الغاية، تحتاج إلى التنفيذ CaptioningManager.CaptioningChangeListener في التطبيق وتسجيل هذا المستمع من خلال الاتصال على:

Kotlin
CaptioningManager.addCaptioningChangeListener(yourChangeListener)
Java
CaptioningManager.addCaptioningChangeListener(yourChangeListener);

عندما يتلقّى تطبيقك مكالمة تُعلمك بتغيير إعدادات الترجمة والشرح، يمكنك بعد ذلك استخراج الإعدادات الجديدة وتعديل نمط النص شرح للوسائط التي يتم تشغيلها حاليًا من خلال إجراء RemoteMediaClient.setTextTrackStyle وتمريره بالأسلوب الجديد.

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

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

ولتحقيق هذه الغاية، يجب أن يسجّل تطبيقك RemoteMediaClient.Listener و RemoteMediaClient.ProgressListener

إذا كانت TextTrackStyle من التغييرات الحالية في الوسائط، فسيتم إعلام كل المرسلين المتصلين من خلال المستمعين المسجَّلين أعلاه في هذه الحالة، يتضمن جهاز SDK المستلم ما إذا كان النمط الجديد مختلفًا عن النمط السابق إلى جميع المرسلين المتصلين بغض النظر عن ذلك. ومع ذلك، إذا كانت حالة تغييرات المسارات النشطة، فقط RemoteMediaClient.ProgressListener في إرسال إشعار إلى المرسلين المتصلين.

استيفاء متطلبات سياسة مشاركة الموارد المتعددة المصادر (CORS)

لبث الوسائط بشكل تكيُّفي، تتطلب تكنولوجيا Google Cast عناوين CORS، ولكن حتى ملفات mp4 البسيطة تتطلب مجموعات بث الوسائط سياسة مشاركة الموارد المتعددة المصادر (CORS) إذا كانت تتضمن مسارات. إذا كنت ترغب في تفعيل "المسارات" لأي وسائط، يجب تفعيل سياسة مشاركة الموارد المتعددة المصادر (CORS) لكل من مجموعات بث المسار والوسائط جداول البيانات. لذلك، إذا لم تتوفر لديك عناوين CORS لوسائط mp4 البسيطة الخاصة بك على خادمك، ثم تضيف مسار ترجمة مصاحبة بسيط، فلن تتمكن ببث الوسائط إلا إذا حدّثت خادمك لتضمين الملفات عنوان CORS. بالإضافة إلى ذلك، يجب السماح بالعناوين التالية على الأقل: Content-Type وaccept-Encoding وrange. لاحظ أن آخر رأسين هما رؤوس إضافية ربما لم تكن بحاجة إليها من قبل.