أثناء التشغيل
يمكن استرداد البيانات الوصفية للوسائط أثناء التشغيل بعدة طرق. الطريقة الأسهل
هي الاستماع إلى حدث
Player.Listener#onMediaMetadataChanged
، لأنّ ذلك سيوفر كائن
MediaMetadata
لاستخدامه، والذي يحتوي على حقول مثل title
و
albumArtist
. بدلاً من ذلك، يؤدي استدعاء Player#getMediaMetadata
إلى عرض الكائن نفسه.
Kotlin
override fun onMediaMetadataChanged(mediaMetadata: MediaMetadata) { mediaMetadata.title?.let(::handleTitle) }
Java
@Override public void onMediaMetadataChanged(MediaMetadata mediaMetadata) { if (mediaMetadata.title != null) { handleTitle(mediaMetadata.title); } }
إذا كان تطبيقك يحتاج إلى الوصول إلى عناصر Metadata.Entry
معيّنة، من المفترض أن يستمع إلى Player.Listener#onMetadata
(للبيانات الوصفية الديناميكية التي يتم عرضها أثناء التشغيل). يمكنك أيضًا بدلاً من ذلك الاطّلاع على البيانات الوصفية الثابتة من خلال TrackSelections#getFormat
.
تتم تعبئة Player#getMediaMetadata
من هذَين المصدرَين.
بدون تشغيل المحتوى
إذا لم تكن هناك حاجة للتشغيل، من الأفضل استخدام MetadataRetriever
لاستخراج البيانات الوصفية لعدم الحاجة إلى إنشاء مشغّل وإعداده.
Kotlin
val trackGroupsFuture = MetadataRetriever.retrieveMetadata(context, mediaItem) Futures.addCallback( trackGroupsFuture, object : FutureCallback<TrackGroupArray?> { override fun onSuccess(trackGroups: TrackGroupArray?) { if (trackGroups != null) handleMetadata(trackGroups) } override fun onFailure(t: Throwable) { handleFailure(t) } }, executor )
Java
ListenableFuture<TrackGroupArray> trackGroupsFuture = MetadataRetriever.retrieveMetadata(context, mediaItem); Futures.addCallback( trackGroupsFuture, new FutureCallback<TrackGroupArray>() { @Override public void onSuccess(TrackGroupArray trackGroups) { handleMetadata(trackGroups); } @Override public void onFailure(Throwable t) { handleFailure(t); } }, executor);
الصور الحيّة
من الممكن أيضًا استخراج البيانات الوصفية لصورة حيّة تتضمّن على سبيل المثال إزاحة الصورة والفيديو وطولها. تتوفّر التنسيقات التالية:
- صور حيّة بتنسيق JPEG تم تسجيلها بواسطة تطبيقَي كاميرا Google Pixel وSamsung. يمكن تشغيل هذا التنسيق بواسطة ExoPlayer، وبالتالي يمكن استرداد البيانات الوصفية المرتبطة به من خلال مشغّل أو باستخدام
MetadataRetriever
. - صور حيّة HEIC تم تسجيلها بواسطة تطبيقات كاميرا Google Pixel وSamsung. لا يمكن لـ ExoPlayer تشغيل هذا التنسيق في الوقت الحالي، وبالتالي يجب استرداد البيانات الوصفية
ذات الصلة باستخدام
MetadataRetriever
.
بالنسبة إلى الصور الحيّة، يتضمّن TrackGroupArray
الذي يتم الحصول عليه مع MetadataRetriever
عنصر TrackGroup
مع Format
واحد يتضمّن إدخال بيانات وصفية MotionPhotoMetadata
.
Kotlin
0.until(trackGroups.length) .asSequence() .mapNotNull { trackGroups[it].getFormat(0).metadata } .filter { metadata -> metadata.length() == 1 } .map { metadata -> metadata[0] } .filterIsInstance<MotionPhotoMetadata>() .forEach(::handleMotionPhotoMetadata)
Java
for (int i = 0; i < trackGroups.length; i++) { TrackGroup trackGroup = trackGroups.get(i); Metadata metadata = trackGroup.getFormat(0).metadata; if (metadata != null && metadata.length() == 1) { Metadata.Entry metadataEntry = metadata.get(0); if (metadataEntry instanceof MotionPhotoMetadata) { MotionPhotoMetadata motionPhotoMetadata = (MotionPhotoMetadata) metadataEntry; handleMotionPhotoMetadata(motionPhotoMetadata); } } }