2010-11-30 15 views
35

de consulta a MediaStore.Video.Media.EXTERNAL_CONTENT_URI devoluciones solamente vídeo en /sdcard/DCIM/100MEDIA¿Cómo obtener una miniatura para el video en mi carpeta/sdcard/Android/data/mypackage/files?

pero quiero conseguir las miniaturas de vídeo en mi carpeta /sdcard/Android/data/mypackage/files. Es posible ?

aquí es parte de mi código:

 ContentResolver cr = getContentResolver(); 
    String[] proj = { 
        BaseColumns._ID 
    }; 

    Cursor c = cr.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, proj, null, null, null); 
    if (c.moveToFirst()) { 
     do 
     { 
      int id = c.getInt(0); 
      Bitmap b = MediaStore.Video.Thumbnails.getThumbnail(cr, id, MediaStore.Video.Thumbnails.MINI_KIND, null); 
      Log.d("*****My Thumbnail*****", "onCreate bitmap " + b); 
      ImageView iv = (ImageView) findViewById(R.id.img_thumbnail); 
      iv.setImageBitmap(b); 
     } 
     while(c.moveToNext()); 
    }   
    c.close(); 

Respuesta

104

Si se encuentra en android-8 (Froyo) o superior, puede utilizar ThumbnailUtils.createVideoThumbnail:

Bitmap thumb = ThumbnailUtils.createVideoThumbnail(path, 
    MediaStore.Images.Thumbnails.MINI_KIND); 
+3

¿es posible suministrar video uri en lugar de la ruta exacta? reproductor de video reproduce el video uri, pero la creación de miniaturas pide una cadena en el constructor –

+2

@Matthew, cómo obtener los marcos de un archivo de video en android –

+0

, intenté usar Thumbnail.createVideoThumbnail pero obtuve el resultado de ser un poco galimatías. Por favor, este el [foto] (https://dl.dropbox.com/u/89231635/device-2012-07-05-162525.png) –

0

Aquí es una respuesta similar a Mateo Willis pero con una reflexión añadida. ¿Por qué? porque ciencia.

/** 
* 
* @param path 
*   the path to the Video 
* @return a thumbnail of the video or null if retrieving the thumbnail failed. 
*/ 
public static Bitmap getVidioThumbnail(String path) { 
    Bitmap bitmap = null; 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) { 
     bitmap = ThumbnailUtils.createVideoThumbnail(path, Thumbnails.MICRO_KIND); 
     if (bitmap != null) { 
      return bitmap; 
     } 
    } 
    // MediaMetadataRetriever is available on API Level 8 but is hidden until API Level 10 
    Class<?> clazz = null; 
    Object instance = null; 
    try { 
     clazz = Class.forName("android.media.MediaMetadataRetriever"); 
     instance = clazz.newInstance(); 
     final Method method = clazz.getMethod("setDataSource", String.class); 
     method.invoke(instance, path); 
     // The method name changes between API Level 9 and 10. 
     if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD) { 
      bitmap = (Bitmap) clazz.getMethod("captureFrame").invoke(instance); 
     } else { 
      final byte[] data = (byte[]) clazz.getMethod("getEmbeddedPicture").invoke(instance); 
      if (data != null) { 
       bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); 
      } 
      if (bitmap == null) { 
       bitmap = (Bitmap) clazz.getMethod("getFrameAtTime").invoke(instance); 
      } 
     } 
    } catch (Exception e) { 
     bitmap = null; 
    } finally { 
     try { 
      if (instance != null) { 
       clazz.getMethod("release").invoke(instance); 
      } 
     } catch (final Exception ignored) { 
     } 
    } 
    return bitmap; 
} 
3

sólo puede utilizar FFmpegMediaMetadataRetriever y olvidar la reflexión:

/** 
* 
* @param path 
*   the path to the Video 
* @return a thumbnail of the video or null if retrieving the thumbnail failed. 
*/ 
public static Bitmap getVideoThumbnail(String path) { 
    Bitmap bitmap = null; 

    FFmpegMediaMetadataRetriever fmmr = new FFmpegMediaMetadataRetriever(); 

    try { 
     fmmr.setDataSource(path);    

     final byte[] data = fmmr.getEmbeddedPicture(); 

     if (data != null) { 
      bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); 
     } 

     if (bitmap == null) { 
      bitmap = fmmr.getFrameAtTime(); 
     } 
    } catch (Exception e) { 
     bitmap = null; 
    } finally { 
     fmmr.release(); 
    } 
    return bitmap; 
} 
+0

¿Podemos usarlo en UIL (https://github.com/nostra13/Android-Universal-Image-Loader) para crear una miniatura de videos y saltar la imagen? UIL necesita una configuración de configuración por aplicación, así que necesito un decodificador que pueda omitir imágenes y decodificar videos. – Adnan

13

Uso Glide va a buscar a la miniatura en asíncrono.

Glide.with(context) 
        .load(videoFilePath) // or URI/path 
        .into(imgView); //imageview to set thumbnail to 
+1

Realmente no funciona para las miniaturas de video remotas –

+1

@HenriquedeSousa Funciona bien para mí hermano. revise su ruta o comparta su fragmento de código – Ajji

+0

Ruta de video remota, como 'http: // url.to/file.mp4' –

2
BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inDither = false; 
options.inPreferredConfig = Bitmap.Config.ARGB_8888; 

Bitmap bitmapThumb = MediaStore.Video.Thumbnails.getThumbnail(mActivity.getContentResolver(), 
    Long.parseLong(video_id), 
    Images.Thumbnails.MINI_KIND, 
    options); 

Opciones utilizar para cargar mapa de bits de disminuir el tamaño del mapa de bits ..

+0

Esto funciona bastante bien. Probado en Android 6.0+ con el Tecno N5 – larrytech

1

Obtener miniatura de vídeo de ID_DE_VÍDEO:

public static Drawable getVideoThumbnail(Context context, int videoID) { 
     try { 
      String[] projection = { 
        MediaStore.Video.Thumbnails.DATA, 
      }; 
      ContentResolver cr = context.getContentResolver(); 
      Cursor cursor = cr.query(
        MediaStore.Video.Thumbnails.EXTERNAL_CONTENT_URI, 
        projection, 
        MediaStore.Video.Thumbnails.VIDEO_ID + "=?", 
        new String[] { String.valueOf(videoID) }, 
        null); 
      cursor.moveToFirst(); 
      return Drawable.createFromPath(cursor.getString(0)); 
     } catch (Exception e) { 
     } 
     return null; 
    } 
1

ver respuesta @Ajji 's:

Glide.with(context) 
        .load(videoFilePath) // or URI/path 
        .into(imgView); //imageview to set thumbnail to 

A veces vuelve negro de la imagen, esta cuestión ya se menciona en los problemas de deslizamiento de la biblioteca

Use este código:

BitmapPool bitmapPool = Glide.get(activity).getBitmapPool(); 
       int microSecond = 6000000;// 6th second as an example 
       VideoBitmapDecoder videoBitmapDecoder = new VideoBitmapDecoder(microSecond); 
       FileDescriptorBitmapDecoder fileDescriptorBitmapDecoder = new FileDescriptorBitmapDecoder(videoBitmapDecoder, bitmapPool, DecodeFormat.PREFER_ARGB_8888); 
       Glide.with(activity) 
         .load(videoPath) 
         .asBitmap() 
         .override(50,50)// Example 
         .videoDecoder(fileDescriptorBitmapDecoder) 
         .into(holder.ivFirstUpload); 
0

Si va a crear directamente imágenes en miniatura de la siguiente manera

Bitmap thumb = ThumbnailUtils.createVideoThumbnail(path, 
    MediaStore.Images.Thumbnails.MINI_KIND); 

Luego es un problema con este método si estás creando miniaturas para un gran conjunto de videos (para una gran cantidad de videos). la aplicación se congelará hasta que se carguen todas las miniaturas porque todo el proceso se está ejecutando en el hilo principal.


Uso SuziLoader

Este cargador carga las imágenes en miniatura para los vídeos que se almacenan localmente en el sistema de ficheros en segundo plano.

String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/video.mp4"; 
ImageView mThumbnail = (ImageView) findViewById(R.id.thumbnail); 

SuziLoader loader = new SuziLoader(); //Create it for once 
loader.with(MainActivity.this) //Context 
    .load(path) //Video path 
    .into(mThumbnail) // imageview to load the thumbnail 
    .type("mini") // mini or micro 
    .show(); // to show the thumbnail 

Para obtener esta dependencia utilice los pasos siguientes

Paso 1. Añadir el repositorio JitPack a su fichero de construcción
agregarlo en su build.gradle raíz al final de repositorios:

allprojects { 
    repositories { 
     ... 
     maven { url 'https://jitpack.io' } 
    } 
} 

Paso 2. Añadir la dependencia

dependencies { 
    compile 'com.github.sushinpv:SuziVideoThumbnailLoader:0.1.0' 
} 

ADD LEER EXTERNO ALMACENAMIENTO Permiso en manifiesto

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 
Cuestiones relacionadas