عندما يحتوي عنصر وسائط على مقاطع صوتية متعددة، يكون اختيار المقاطع الصوتية هو العملية التي تحدد المقاطع التي يتم اختيارها لتشغيلها. يتم ضبط عملية اختيار المسار
من خلال TrackSelectionParameters
، ما يسمح بتحديد العديد من
القيود المختلفة والعمليات التي تلغي التأثير في اختيار المسار.
طلب الأغاني المتاحة
يمكنك الاستماع إلى Player.Listener.onTracksChanged
لتلقّي إشعارات بشأن التغييرات
في الأغاني، بما في ذلك:
- تصبح الأغاني المتوفّرة معروفة عند اكتمال إعداد ملف الوسائط الذي يتم تشغيله. يُرجى العِلم أنّه على المشغّل إعداد عنصر وسائط لمعرفة المقاطع الصوتية التي يحتوي عليها.
- تغيُّر الأغاني المتاحة بسبب انتقال التشغيل من ملف وسائط إلى آخر
- التغييرات على المقاطع الصوتية المحدّدة
Kotlin
player.addListener( object : Player.Listener { override fun onTracksChanged(tracks: Tracks) { // Update UI using current tracks. } } )
Java
player.addListener( new Player.Listener() { @Override public void onTracksChanged(Tracks tracks) { // Update UI using current tracks. } });
يمكنك أيضًا طلب معلومات عن الأغاني الحالية من خلال الاتصال بالرقم player.getCurrentTracks()
.
يحتوي العنصر Tracks
الذي تم إرجاعه على قائمة بعناصر Tracks.Group
، حيث تعرض الأغاني
ضمن Group
واحد المحتوى نفسه ولكن بتنسيقات مختلفة.
على سبيل المثال، يمكن تجميع المقاطع الصوتية في تشغيل مكيّف يتم فيه توفير خلاصة فيديو رئيسية بمعدلات نقل بيانات بث خمسة، وخلاصة فيديو بديلة (مثل زاوية كاميرا مختلفة في مباراة رياضية) بمعدلَي نقل بيانات بث. في هذه الحالة، ستتوفّر مجموعتَان من مقاطع الفيديو، إحداهما تتوافق مع خلاصة الفيديو الرئيسية التي تحتوي على خمسة مقاطع، والثانية لخلاصة الفيديو البديلة التي تحتوي على مقطعَين.
لا يتم تجميع المقاطع الصوتية التي تختلف لغاتها، لأنّ المحتوى باللغة المختلفة لا يُعتبر متطابقًا. في المقابل، يمكن تجميع المقاطع الصوتية باللغة نفسها التي تختلف فقط في خصائص مثل معدل نقل البيانات ومقدار sampling وعدد القنوات وما إلى ذلك. وينطبق ذلك أيضًا على مسارات النص.
يمكن البحث في كل Group
لتحديد الأغاني المتوافقة مع
التشغيل، والأغاني المحدّدة حاليًا، وFormat
التي تستخدمها كل أغنية:
Kotlin
for (trackGroup in tracks.groups) { // Group level information. val trackType = trackGroup.type val trackInGroupIsSelected = trackGroup.isSelected val trackInGroupIsSupported = trackGroup.isSupported for (i in 0 until trackGroup.length) { // Individual track information. val isSupported = trackGroup.isTrackSupported(i) val isSelected = trackGroup.isTrackSelected(i) val trackFormat = trackGroup.getTrackFormat(i) } }
Java
for (Tracks.Group trackGroup : tracks.getGroups()) { // Group level information. @C.TrackType int trackType = trackGroup.getType(); boolean trackInGroupIsSelected = trackGroup.isSelected(); boolean trackInGroupIsSupported = trackGroup.isSupported(); for (int i = 0; i < trackGroup.length; i++) { // Individual track information. boolean isSupported = trackGroup.isTrackSupported(i); boolean isSelected = trackGroup.isTrackSelected(i); Format trackFormat = trackGroup.getTrackFormat(i); } }
- يكون المقطع الصوتي متوافقًا إذا كان
Player
قادرًا على فك ترميز عيّنات المقطع الصوتي وعرضها. يُرجى العِلم أنّه حتى إذا كانت مجموعات مسارات متعددة من النوع نفسه (مثل مجموعات مسارات صوتية متعددة) متوافقة، فهذا يعني فقط أنّه يمكن تشغيلها بشكلٍ فردي، ولا يمكن لجهاز التشغيل تشغيلها في الوقت نفسه بالضرورة. - يتم اختيار مقطع صوتي إذا تم اختياره للتشغيل استنادًا إلى
TrackSelectionParameters
الحالي. إذا تم اختيار عدة مقاطع صوتية ضمن مجموعة مقاطع صوتية واحدة، يستخدم المشغّل هذه المقاطع الصوتية لتشغيل الفيديوهات التكيُّفي (على سبيل المثال، مقاطع صوتية متعددة للفيديوهات بمعدّلات نقل بيانات مختلفة). يُرجى العِلم أنّه سيتم تشغيل مقطع واحد فقط من هذه المقاطع الصوتية في كل مرة.
تعديل مَعلمات اختيار المقاطع الصوتية
يمكن ضبط عملية اختيار الأغنية باستخدام
Player.setTrackSelectionParameters
. ويمكنك إجراء ذلك قبل البدء وحتى أثناء
التشغيل. يوضّح المثال التالي كيفية الحصول على القيمة الحالية لسمة
TrackSelectionParameters
من المشغّل وتعديلها وتعديل Player
بالنتيجة المعدّلة:
Kotlin
player.trackSelectionParameters = player.trackSelectionParameters .buildUpon() .setMaxVideoSizeSd() .setPreferredAudioLanguage("hu") .build()
Java
player.setTrackSelectionParameters( player .getTrackSelectionParameters() .buildUpon() .setMaxVideoSizeSd() .setPreferredAudioLanguage("hu") .build());
اختيار المقاطع الصوتية استنادًا إلى القيود
تتيح لك معظم الخيارات في TrackSelectionParameters
تحديد قيود،
تكون مستقلة عن قنوات الإصدار المتاحة فعليًا. تشمل المقيّدات
المتوفّرة ما يلي:
- الحد الأقصى والحد الأدنى لعرض الفيديو وارتفاعه وعدد اللقطات في الثانية ومعدّل نقل البيانات
- الحد الأقصى لعدد قنوات الصوت ومعدّل نقل البيانات
- أنواع MIME المفضّلة للفيديوهات والصوت
- لغات الصوت المفضّلة وعلامات الأدوار
- لغات النصوص المفضّلة وعلامات الأدوار
يستخدم ExoPlayer الإعدادات التلقائية المناسبة لهذه القيود، على سبيل المثال، حصر دقة الفيديو بحجم الشاشة ومنح الأولوية للغة الصوت التي تطابق إعدادات لغة النظام لدى المستخدم.
هناك عدة مزايا لاستخدام ميزة اختيار المقاطع الصوتية المستندة إلى القيود بدلاً من اختيار مقاطع صوتية معيّنة من بين المقاطع المتاحة:
- يمكنك تحديد القيود قبل معرفة الأغاني التي يوفّرها عنصر الوسائط. وهذا يعني أنّه يمكن تحديد القيود قبل أن يُعدّ المشغّل عنصرًا وسائط، في حين أنّ اختيار مقاطع صوتية معيّنة يتطلّب من رمز التطبيق الانتظار إلى أن تصبح المقاطع الصوتية المتاحة معروفة.
- يتم تطبيق القيود على جميع عناصر الوسائط في قائمة تشغيل، حتى إذا كانت هذه
العناصر تتضمّن مقاطع صوتية مختلفة متاحة. على سبيل المثال، سيتم تطبيق قيد اللغة المفضّلة للمحتوى الصوتي
تلقائيًا على جميع عناصر الوسائط، حتى إذا كان
Format
المقطع الصوتي بهذه اللغة يختلف من عنصر وسائط إلى آخر. لا ينطبق ذلك عند اختيار مسارات معيّنة، كما هو موضّح أدناه.
اختيار أغانٍ معيّنة
يمكنك اختيار مسارات معيّنة باستخدام TrackSelectionParameters
. أولاً،
يجب البحث عن الأغاني المتاحة حاليًا في المشغّل باستخدام
Player.getCurrentTracks
. ثانيًا، بعد تحديد المقاطع الصوتية التي تريد اختيارها،
يمكنك ضبطها على TrackSelectionParameters
باستخدام TrackSelectionOverride
.
على سبيل المثال، لاختيار المقطع الصوتي الأول من audioTrackGroup
معيّن:
Kotlin
player.trackSelectionParameters = player.trackSelectionParameters .buildUpon() .setOverrideForType( TrackSelectionOverride(audioTrackGroup.mediaTrackGroup, /* trackIndex= */ 0) ) .build()
Java
player.setTrackSelectionParameters( player .getTrackSelectionParameters() .buildUpon() .setOverrideForType( new TrackSelectionOverride( audioTrackGroup.getMediaTrackGroup(), /* trackIndex= */ 0)) .build());
لن ينطبق TrackSelectionOverride
إلا على عناصر الوسائط التي تحتوي على
TrackGroup
مطابق تمامًا للقيمة المحدّدة في العنصر البديل. وبالتالي، قد لا تنطبق عملية
الإلغاء على عنصر وسائط لاحق إذا كان هذا العنصر يحتوي على
مقاطع صوتية مختلفة.
إيقاف أنواع المقاطع الصوتية أو المجموعات
يمكن إيقاف أنواع المقاطع، مثل الفيديو أو الصوت أو النص، نهائيًا باستخدام الرمز
TrackSelectionParameters.Builder.setTrackTypeDisabled
. سيتم إيقاف نوع الأغنية المتوقف نهائيًا
لجميع عناصر الوسائط:
Kotlin
player.trackSelectionParameters = player.trackSelectionParameters .buildUpon() .setTrackTypeDisabled(C.TRACK_TYPE_VIDEO, /* disabled= */ true) .build()
Java
player.setTrackSelectionParameters( player .getTrackSelectionParameters() .buildUpon() .setTrackTypeDisabled(C.TRACK_TYPE_VIDEO, /* disabled= */ true) .build());
بدلاً من ذلك، يمكنك منع اختيار الأغاني من TrackGroup
محدّد من خلال تحديد عنصر إلغاء فارغ لهذه المجموعة:
Kotlin
player.trackSelectionParameters = player.trackSelectionParameters .buildUpon() .addOverride( TrackSelectionOverride(disabledTrackGroup.mediaTrackGroup, /* trackIndices= */ listOf()) ) .build()
Java
player.setTrackSelectionParameters( player .getTrackSelectionParameters() .buildUpon() .addOverride( new TrackSelectionOverride( disabledTrackGroup.getMediaTrackGroup(), /* trackIndices= */ ImmutableList.of())) .build());
تخصيص أداة اختيار المقاطع
تقع مسؤولية اختيار المسار على TrackSelector
، وهو مثيل
يمكن توفيره عند إنشاء ExoPlayer
والحصول عليه لاحقًا
باستخدام ExoPlayer.getTrackSelector()
.
Kotlin
val trackSelector = DefaultTrackSelector(context) val player = ExoPlayer.Builder(context).setTrackSelector(trackSelector).build()
Java
DefaultTrackSelector trackSelector = new DefaultTrackSelector(context); ExoPlayer player = new ExoPlayer.Builder(context).setTrackSelector(trackSelector).build();
DefaultTrackSelector
هو TrackSelector
مرن ومناسب لمعظم حالات الاستخدام. ويستخدم هذا العنصر مجموعة TrackSelectionParameters
في Player
، ولكنه يقدّم أيضًا
بعض خيارات التخصيص المتقدّمة التي يمكن تحديدها في
DefaultTrackSelector.ParametersBuilder
:
Kotlin
trackSelector.setParameters( trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true)) )
Java
trackSelector.setParameters( trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true));
النفق
يمكنك تفعيل ميزة "التشغيل عبر نفق" في الحالات التي تتيح فيها مجموعة مشغّلات الوسائط والمقاطع الصوتية التي تم اختيارها ذلك. لإجراء ذلك، استخدِم رمز
DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true)
.
تخفيف عبء الملفات الصوتية
يمكنك تفعيل تشغيل الصوت الذي تم نقله في الحالات التي تتيح فيها مجموعة
مشغّلات الوسائط والمقاطع الصوتية المحدّدة ذلك. لإجراء ذلك، حدِّد
AudioOffloadModePreferences
في TrackSelectionParameters
.
Kotlin
val audioOffloadPreferences = AudioOffloadPreferences.Builder() .setAudioOffloadMode(AudioOffloadPreferences.AUDIO_OFFLOAD_MODE_ENABLED) // Add additional options as needed .setIsGaplessSupportRequired(true) .build() player.trackSelectionParameters = player.trackSelectionParameters .buildUpon() .setAudioOffloadPreferences(audioOffloadPreferences) .build()
Java
AudioOffloadPreferences audioOffloadPreferences = new AudioOffloadPreferences.Builder() .setAudioOffloadMode(AudioOffloadPreferences.AUDIO_OFFLOAD_MODE_ENABLED) // Add additional options as needed .setIsGaplessSupportRequired(true) .build(); player.setTrackSelectionParameters( player.getTrackSelectionParameters() .buildUpon() .setAudioOffloadPreferences(audioOffloadPreferences) .build()); );