Clase MediaMetadataRetriever en Android con ejemplos

una clase MediaMetadataRetriever proporciona una interfaz unificada para recuperar fotogramas y metadatos de un archivo multimedia de entrada. Se encuentra en el paquete android.media . Por ejemplo: recuperar el nombre de la canción, el nombre del artista, el ancho o la altura del video, el formato/tipo de video del video, la duración del medio, la fecha de modificación del medio, etc. Las constantes/claves proporcionadas por la clase MediaMetadataRetriever son abundantes. Estas constantes se utilizan para recuperar información multimedia. Aunque el trabajo realizado por muchas de las constantes es obvio por su nombre, aquí hay una pequeña descripción de cada constante presente en la clase MediaMetadataRetriever.

Constantes importantes de la clase MediaMetadataRetriever

Tipo constante

Nombre constante

Descripción

En t    METADATA_KEY_ALBUM La clave de metadatos para recuperar la información sobre el título del álbum de la fuente de datos.
En t  METADATA_KEY_ALBUMARTIST La clave de metadatos para recuperar la información sobre los artistas intérpretes o ejecutantes asociados con la fuente de datos.
En t METADATA_CLAVE_ARTISTA La clave de metadatos para recuperar la información sobre el artista de la fuente de datos.
En t METADATA_CLAVE_AUTOR La clave de metadatos para recuperar la información sobre el autor de la fuente de datos.
En t METADATA_KEY_CD_TRACK_NUMBER La clave de metadatos para recuperar la string numérica que describe el orden de la fuente de datos de audio en su grabación original.
En t METADATA_CLAVE_COMPILACIÓN   La clave de metadatos para recuperar el estado de compilación del álbum de música.
En t METADATA_KEY_COMPOSER   La clave de metadatos para recuperar la información sobre el autor de la fuente de datos.
En t METADATA_CLAVE_FECHA   La clave de metadatos para recuperar la fecha en que se creó o modificó la fuente de datos.
En t METADATA_KEY_DISC_NUMBER   La clave de metadatos para recuperar la string numérica que describe de qué parte de un conjunto proviene la fuente de datos de audio.
En t METADATA_CLAVE_DURACIÓN                       La clave de metadatos para recuperar la duración de la reproducción de la fuente de datos.

Tipo constante

Nombre constante

Descripción

En t  METADATA_KEY_GENRE   La clave de metadatos para recuperar el tipo de contenido o el género de la fuente de datos.
En t METADATA_KEY_MIMETYPE   La clave de metadatos para recuperar el tipo MIME del origen de datos.
En t METADATA_KEY_NUM_TRACKS   La clave de metadatos para recuperar la cantidad de pistas, como audio, video, texto, en la fuente de datos, como un archivo mp4 o 3gpp.
En t METADATA_KEY_TITLE   La clave de metadatos para recuperar el título de la fuente de datos.
En t METADATA_KEY_WRITER   La clave de metadatos para recuperar la información del escritor (como el letrista) de la fuente de datos.
En t METADATA_CLAVE_AÑO   La clave de metadatos para recuperar el año en que se creó o modificó la fuente de datos.
En t OPTION_CLOSEST   Esta opción se usa con getFrameAtTime(long, int) para recuperar un cuadro (no necesariamente un cuadro clave) asociado con una fuente de datos que se encuentra más cerca o en el momento dado.
En t OPCIÓN_CLOSEST_SYNC   Esta opción se usa con getFrameAtTime(long, int) para recuperar un cuadro de sincronización (o clave) asociado con una fuente de datos que se encuentra más cerca (en el tiempo) o en el momento dado.
En t OPTION_NEXT_SYNC   Esta opción se usa con getFrameAtTime(long, int) para recuperar un cuadro de sincronización (o clave) asociado con una fuente de datos que se encuentra justo después o en el momento dado.
En t OPTION_PREVIOUS_SYNC   Esta opción se usa con getFrameAtTime(long, int) para recuperar un cuadro de sincronización (o clave) asociado con una fuente de datos que se encuentra justo antes o en el momento dado.

Métodos disponibles en la clase MediaMetadataRetriever

Tipo de método

Métodos

Cuerda

extractMetadata(int código clave)

Llame a este método después de setDataSource().

byte[]

getEmbeddedPicture()

Llame a este método después de setDataSource().

mapa de bits

getFrameAtTime(long timeUs, opción int)

Llame a este método después de setDataSource().

mapa de bits

getFrameAtTime(mucho tiempo para nosotros)

Llame a este método después de setDataSource().

mapa de bits

getFrameAtTime()

Llame a este método después de setDataSource().

vacío

liberar()

Llámalo cuando hayas terminado con el objeto.

Este método libera la memoria asignada internamente.

vacío

setDataSource(FileDescriptor fd, desplazamiento largo, longitud larga)

Establece la fuente de datos (FileDescriptor) a usar.

vacío

setDataSource(ruta de la string)

Establece la fuente de datos (nombre de la ruta del archivo) que se utilizará.

vacío

setDataSource(FileDescriptor fd)

Establece la fuente de datos (FileDescriptor) a usar.

vacío

setDataSource(Contexto contexto, Uri uri)

Establece la fuente de datos como un Uri de contenido.

vacío    

Cerca()

Cierra este recurso, renunciando a cualquier recurso subyacente. 

Este método se invoca automáticamente en los objetos gestionados por 

la declaración de prueba con recursos.

Ejemplos

1. Obtenga la duración del mp3

Aquí está el fragmento de código de muestra en Java para obtener la duración del mp3. 

Java

// load data file
// filePath is of type String which holds the path of file
MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever();
metaRetriever.setDataSource(filePath);
  
// get mp3 info
String duration = metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
long dur = Long.parseLong(duration);
  
// convert duration to minute:seconds
String seconds = String.valueOf((dur % 60000) / 1000);
String minutes = String.valueOf(dur / 60000);
String out = minutes + ":" + seconds;
if (seconds.length() == 1) {
    txtTime.setText("0" + minutes + ":0" + seconds);
}
else {
    txtTime.setText("0" + minutes + ":" + seconds);
}
  
// close object
metaRetriever.release();

2. Detecta la orientación del video

A continuación se muestra un vídeo de muestra

Aquí está el fragmento de código de muestra en Java para detectar la orientación del video

Java

MediaMetadataRetriever m = new MediaMetadataRetriever();
  
// load data file
m.setDataSource(path);
  
// getting the bitmap of a frame from video
Bitmap thumbnail = m.getFrameAtTime();
  
if (Build.VERSION.SDK_INT >= 17) {
    String s = m.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION);
}
  
// Another way of determining whether the video is Landscape or portrait
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(inputPath);
video_width = Integer.valueOf(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH));
video_height = Integer.valueOf(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT));
  
// close object
retriever.release();
  
// If the width is bigger than the height then it means that
// the video was taken in landscape mode and vice versa.
if ((video_width > video_height)) {
    // landscape
}
else {
    // portrait
}

3. Configuración de la portada del álbum y el título del álbum en una aplicación de música

A continuación se muestra una imagen de muestra

Aquí está el fragmento de código de muestra en Java para configurar la portada del álbum y el título del álbum en una aplicación de música.

Java

MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(filePath);
  
// getting the embedded picture from media
byte[] art = retriever.getEmbeddedPicture();
  
if (art != null) {
    // Convert the byte array to a bitmap
    imgAlbum.setImageBitmap(BitmapFactory.decodeByteArray(art, 0, art.length));
}
else {
    imgAlbum.setImageResource(R.drawable.no_image);
}
// close object
retriever.release();

4. Hacer una actividad CropVideo como TikTok

A continuación se muestra un vídeo de muestra

Aquí está el fragmento de código de muestra en Java para hacer una actividad CropVideo como TikTok.

Java

try {
    MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
    mediaMetadataRetriever.setDataSource(context, videoUri);
  
    // Retrieve media data use microsecond
    long interval = (endPosition - startPosition) / (totalThumbsCount - 1);
    for (long i = 0; i < totalThumbsCount; ++i) {
        long frameTime = startPosition + interval * i;
        Bitmap bitmap = mediaMetadataRetriever.getFrameAtTime(frameTime * 1000, MediaMetadataRetriever.OPTION_CLOSEST_SYNC);
        if (bitmap == null)
            continue;
        try {
            bitmap = Bitmap.createScaledBitmap(bitmap, THUMB_WIDTH, THUMB_HEIGHT, false);
        }
        catch (final Throwable t) {
            t.printStackTrace();
        }
        // add bitmaps to the recyclerview here…
    }
    mediaMetadataRetriever.release();
}
catch (final Throwable e) {
    Thread.getDefaultUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e);
}

Nota:

  1. Compruebe siempre si existe una ruta de archivo ilegal.
  2. Manejar la condición de mapa de bits nulo. Puede haber casos en los que los medios no devuelvan un mapa de bits válido.
  3. El índice del marco debe ser el de un marco válido. El número total de fotogramas disponibles para la recuperación se puede consultar a través de la clave METADATA_KEY_VIDEO_FRAME_COUNT.
  4. Al recuperar el marco en la posición de tiempo dada, no hay garantía de que la fuente de datos tenga un marco ubicado en la posición. Cuando esto sucede, se devolverá un marco cercano. Si el tiempo es negativo, se ignorarán la posición y la opción de tiempo, y se podrá devolver cualquier trama que la implementación considere representativa.
  5. setDataSource(), llame a este método antes que el resto de los métodos de esta clase. Este método puede llevar mucho tiempo.

Enlace de referencia: https://developer.android.com/reference/android/media/MediaMetadataRetriever

Publicación traducida automáticamente

Artículo escrito por raghav14 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *