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

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

يمكن استرداد البيانات الوصفية للوسائط أثناء التشغيل بعدة طرق. الطريقة الأسهل هي الاستماع إلى حدث 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);
    }
  }
}