/* * Copyright (C) 2008 The Android Open Source Project * Copyright (C) 2013 YIXIA.COM * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package io.vov.vitamio; import android.content.ContentResolver; import android.content.Context; import android.content.res.AssetFileDescriptor; import android.graphics.Bitmap; import android.net.Uri; import android.util.Log; import io.vov.vitamio.utils.FileUtils; import java.io.FileDescriptor; import java.io.IOException; /** * MediaMetadataRetriever is used to get meta data from any media file * <p/> * * <pre> * MediaMetadataRetriever mmr = new MediaMetadataRetriever(this); * mmr.setDataSource(this, mediaUri); * String title = mmr.extractMetadata(METADATA_KEY_TITLE); * Bitmap frame = mmr.getFrameAtTime(-1); * mmr.release(); * </pre> */ public class MediaMetadataRetriever { private AssetFileDescriptor mFD = null; static { String LIB_ROOT = Vitamio.getLibraryPath(); Log.i("LIB ROOT: %s", LIB_ROOT); System.load(LIB_ROOT + "libstlport_shared.so"); System.load(LIB_ROOT + "libvscanner.so"); loadFFmpeg_native(LIB_ROOT + "libffmpeg.so"); native_init(); } private int mNativeContext; public MediaMetadataRetriever(Context ctx) { native_setup(); } private static native boolean loadFFmpeg_native(String ffmpegPath); public void setDataSource(Context context, Uri uri) throws IOException, IllegalArgumentException, SecurityException, IllegalStateException { if (context == null || uri == null) throw new IllegalArgumentException(); String scheme = uri.getScheme(); if (scheme == null || scheme.equals("file")) { setDataSource(FileUtils.getPath(uri.toString())); return; } try { ContentResolver resolver = context.getContentResolver(); mFD = resolver.openAssetFileDescriptor(uri, "r"); if (mFD == null) return; setDataSource(mFD.getParcelFileDescriptor().getFileDescriptor()); return; } catch (Exception e) { closeFD(); } Log.e("Couldn't open file on client side, trying server side %s", uri.toString()); setDataSource(uri.toString()); return; } public native void setDataSource(String path) throws IOException, IllegalArgumentException, IllegalStateException; public native void setDataSource(FileDescriptor fd) throws IOException, IllegalArgumentException, IllegalStateException; /** * Call this method after setDataSource(). This method retrieves the meta data * value associated with the keyCode. * * The keyCode currently supported is listed below as METADATA_XXX constants. * With any other value, it returns a null pointer. * * @param keyCode One of the constants listed below at the end of the class. * @return The meta data value associate with the given keyCode on success; * null on failure. */ public native String extractMetadata(String keyCode) throws IllegalStateException; public native Bitmap getFrameAtTime(long timeUs) throws IllegalStateException; /** * Call this method after setDataSource(). This method finds the optional * graphic or album/cover art associated associated with the data source. If * there are more than one pictures, (any) one of them is returned. * * @return null if no such graphic is found. */ public native byte[] getEmbeddedPicture() throws IllegalStateException; private native void _release(); private native void native_setup(); private static native final void native_init(); private native final void native_finalize(); public void release() { _release(); closeFD(); } @Override protected void finalize() throws Throwable { try { native_finalize(); } finally { super.finalize(); } } private void closeFD() { if (mFD != null) { try { mFD.close(); } catch (IOException e) { } mFD = null; } } /* * Do not change these metadata key values without updating their * counterparts in c file */ /** * The metadata key to retrieve the information about the album title of the * data source. */ public static final String METADATA_KEY_ALBUM = "album"; /** * The metadata key to retrieve the main creator of the set/album, if * different from artist. e.g. "Various Artists" for compilation albums. */ public static final String METADATA_KEY_ALBUM_ARTIST = "album_artist"; /** * The metadata key to retrieve the information about the artist of the data * source. */ public static final String METADATA_KEY_ARTIST = "artist"; /** * The metadata key to retrieve the any additional description of the file. */ public static final String METADATA_KEY_COMMENT = "comment"; /** * The metadata key to retrieve the information about the author of the data * source. */ public static final String METADATA_KEY_AUTHOR = "author"; /** * The metadata key to retrieve the information about the composer of the data * source. */ public static final String METADATA_KEY_COMPOSER = "composer"; /** * The metadata key to retrieve the name of copyright holder. */ public static final String METADATA_KEY_COPYRIGHT = "copyright"; /** * The metadata key to retrieve the date when the file was created, preferably * in ISO 8601. */ public static final String METADATA_KEY_CREATION_TIME = "creation_time"; /** * The metadata key to retrieve the date when the work was created, preferably * in ISO 8601. */ public static final String METADATA_KEY_DATE = "date"; /** * The metadata key to retrieve the number of a subset, e.g. disc in a * multi-disc collection. */ public static final String METADATA_KEY_DISC = "disc"; /** * The metadata key to retrieve the name/settings of the software/hardware * that produced the file. */ public static final String METADATA_KEY_ENCODER = "encoder"; /** * The metadata key to retrieve the person/group who created the file. */ public static final String METADATA_KEY_ENCODED_BY = "encoded_by"; /** * The metadata key to retrieve the original name of the file. */ public static final String METADATA_KEY_FILENAME = "filename"; /** * The metadata key to retrieve the content type or genre of the data source. */ public static final String METADATA_KEY_GENRE = "genre"; /** * The metadata key to retrieve the main language in which the work is * performed, preferably in ISO 639-2 format. Multiple languages can be * specified by separating them with commas. */ public static final String METADATA_KEY_LANGUAGE = "language"; /** * The metadata key to retrieve the artist who performed the work, if * different from artist. E.g for "Also sprach Zarathustra", artist would be * "Richard Strauss" and performer "London Philharmonic Orchestra". */ public static final String METADATA_KEY_PERFORMER = "performer"; /** * The metadata key to retrieve the name of the label/publisher. */ public static final String METADATA_KEY_PUBLISHER = "publisher"; /** * The metadata key to retrieve the name of the service in broadcasting * (channel name). */ public static final String METADATA_KEY_SERVICE_NAME = "service_name"; /** * The metadata key to retrieve the name of the service provider in * broadcasting. */ public static final String METADATA_KEY_SERVICE_PROVIDER = "service_provider"; /** * The metadata key to retrieve the data source title. */ public static final String METADATA_KEY_TITLE = "title"; /** * The metadata key to retrieve the number of this work in the set, can be in * form current/total. */ public static final String METADATA_KEY_TRACK = "track"; /** * The metadata key to retrieve the total bitrate of the bitrate variant that * the current stream is part of. */ public static final String METADATA_KEY_VARIANT_BITRATE = "bitrate"; /** * The metadata key to retrieve the playback duration of the data source. */ public static final String METADATA_KEY_DURATION = "duration"; /** * The metadata key to retrieve the audio codec of the work. */ public static final String METADATA_KEY_AUDIO_CODEC = "audio_codec"; /** * The metadata key to retrieve the video codec of the work. */ public static final String METADATA_KEY_VIDEO_CODEC = "video_codec"; /** * This key retrieves the video rotation angle in degrees, if available. The * video rotation angle may be 0, 90, 180, or 270 degrees. */ public static final String METADATA_KEY_VIDEO_ROTATION = "rotate"; /** * If the media contains video, this key retrieves its width. */ public static final String METADATA_KEY_VIDEO_WIDTH = "width"; /** * If the media contains video, this key retrieves its height. */ public static final String METADATA_KEY_VIDEO_HEIGHT = "height"; /** * The metadata key to retrieve the number of tracks, such as audio, video, * text, in the data source, such as a mp4 or 3gpp file. */ public static final String METADATA_KEY_NUM_TRACKS = "num_tracks"; /** * If this key exists the media contains audio content. if has audio, return * 1. */ public static final String METADATA_KEY_HAS_AUDIO = "has_audio"; /** * If this key exists the media contains video content. if has video, return * 1. */ public static final String METADATA_KEY_HAS_VIDEO = "has_video"; }