عندما يحتوي عنصر وسائط على مقاطع صوتية متعددة، يكون اختيار المقطع الصوتي هو العملية التي تحدّد المقاطع الصوتية التي سيتم تشغيلها. يتم ضبط عملية اختيار المقطع الصوتي من خلال 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 واحد المحتوى نفسه ولكن بتنسيقات مختلفة.
كمثال على كيفية تجميع المقاطع الصوتية والمرئية، لنفترض أنّ هناك تشغيلاً متكيّفًا يتم فيه توفير خلاصة فيديو رئيسية بخمس معدّلات نقل بيانات، وخلاصة فيديو بديلة (مثلاً، زاوية كاميرا مختلفة في مباراة رياضية) بمعدّلين لنقل البيانات. في هذه الحالة، سيكون هناك مجموعتان من مقاطع الفيديو، إحداهما تتوافق مع خلاصة الفيديو الرئيسية التي تحتوي على خمسة مقاطع، والثانية مع خلاصة الفيديو البديلة التي تحتوي على مقطعين.
لا يتم تجميع المقاطع الصوتية التي تختلف لغاتها، لأنّ المحتوى بلغات مختلفة لا يُعتبر هو نفسه. في المقابل، يمكن تجميع المقاطع الصوتية باللغة نفسها التي تختلف فقط في خصائص مثل معدّل نقل البيانات ومعدّل أخذ العيّنات وعدد القنوات وما إلى ذلك. وينطبق ذلك أيضًا على مقاطع النصوص.
يمكن طلب معلومات من كل 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());