جارٍ استرداد البيانات الوصفية

أثناء التشغيل

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