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:
- Compruebe siempre si existe una ruta de archivo ilegal.
- 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.
- 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.
- 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.
- 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