it-swarm.com.de

Wie bekomme ich ein Miniaturbild für ein Video in meinem Ordner/sdcard/Android/data/mypackage/files?

Abfrage an MediaStore.Video.Media.EXTERNAL_CONTENT_URI gibt nur Video in /sdcard/DCIM/100MEDIA zurück

Ich möchte jedoch Miniaturansichten für das Video in meinem /sdcard/Android/data/mypackage/files-Ordner abrufen. Ist es möglich ?

Hier ist ein Teil meines Codes:

        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();
41

Wenn Sie sich auf Android-8 (Froyo) oder höher befinden, können Sie ThumbnailUtils.createVideoThumbnail verwenden:

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

Verwenden Sie Glide , um das Thumbnail asynchron abzurufen. 

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

Sie können einfach FFmpegMediaMetadataRetriever verwenden und die Reflexion vergessen:

/**
 *
 * @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;
}
4
William Seemann
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);

Verwenden Sie Optionen, um die Bitmapgröße zu laden.

1
Vaibhav Jain

siehe @Ajjis Antwort:

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

Es wird manchmal ein schwarzes Bild ausgegeben. Dieses Problem wurde bereits in den Ausgaben der Glide-Bibliothek erwähnt

Verwenden Sie diesen Code: 

 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);
1
TapanHP

3 Möglichkeiten, ein Miniaturbild eines Videos abzurufen:

  1. Am besten verwenden Sie Glide . Es erledigt die gesamte Arbeit im Hintergrund, lädt die Miniaturansicht direkt in die ImageView und kann beim Laden sogar Animationen anzeigen. Es kann mit Uri, Byte [] und vielen anderen Quellen arbeiten . Wie @Ajji erwähnt:

    Glide.with(context)
                .load(videoFilePath) // or URI/path
                .into(imgView); //imageview to set thumbnail to
    
  2. Wenn Sie eine Bitmap nur auf die effizienteste Weise benötigen, verwenden Sie ThumbnailUtils. In meinem Fall wurde eine Bitmap mit einer Größe von 294 912 Bytes (Video, das mit einer Kamera von Nexus5X - 1280x720 aufgenommen wurde) erstellt, und die Qualität war dieselbe wie beim nächsten Ansatz. Nach dem Komprimieren in JPEG mit 90 wird eine JPEG-Datei mit ~ 30 KB erzeugt.

    Bitmap thumb = ThumbnailUtils.createVideoThumbnail(path,
    MediaStore.Images.Thumbnails.MINI_KIND);
    
  3. Der letzte Ansatz ist die Verwendung von MediaMetadataRetriever. In meinem Fall wurde jedoch eine Bitmap mit einer Größe erstellt, die mehr als 6-mal größer ist als mit ThumbnailUtils (mit derselben Qualität). Betrachten Sie es als letzten Ausweg. 

    MediaMetadataRetriever mMMR = new MediaMetadataRetriever();
                        mMMR.setDataSource(mContext, mAttachment.getUri());
                        bmp = mMMR.getFrameAtTime();
    

P.S .: Vergessen Sie nicht, dass Bilder in den Formaten Bitmap, byte[] und real file .jpeg problemlos in jede Richtung innerhalb dieser Typen konvertiert werden können. Im Falle von Uris haben Sie oft keinen richtigen Pfad zur Quelldatei, aber Sie können den Bytestrom immer so abrufen:

    InputStream in =  mContext.getContentResolver().openInputStream(uri);

und mit diesem Eingangsstrom können Sie machen, was Sie wollen.

1
Kirill Karmazin

Video-Miniaturansicht von VIDEO_ID abrufen:

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
trivatus

Hier eine ähnliche Antwort auf Matthew Willis, jedoch mit zusätzlichem Nachdenken. Warum? weil die Wissenschaft.

/**
 *
 * @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;
}
0
Jared Rummler

Versuchen Sie etwas Ähnliches zu diesem Code-Snippet:

img.setImageBitmap(ThumbnailUtils.createVideoThumbnail(
                   Environment.getExternalStorageDirectory().getPath() + "/WhatsApp/Media/WhatsApp Video/"+getItem(position),
                   MediaStore.Video.Thumbnails.FULL_SCREEN_KIND));
0
user8085762
Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
        String[] projection = { MediaStore.Video.VideoColumns.DATA };
        Cursor c = getContentResolver().query(uri, projection, null, null, null);
        int vidsCount = 0;
        if (c != null) {
            vidsCount = c.getCount();
            while (c.moveToNext()) {
                String path = c.getString(0);
                Bitmap thumb = ThumbnailUtils.createVideoThumbnail(path,
                        MediaStore.Images.Thumbnails.MINI_KIND);
            }
            c.close();
        }
0

Wenn Sie Thumbnails direkt wie folgt erstellen

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

Bei dieser Methode gibt es ein Problem, wenn Sie Miniaturansichten für große Videosets erstellen (für eine große Anzahl von Videos). Die Anwendung wird eingefroren, bis alle Miniaturbilder geladen sind, da der gesamte Prozess im Hauptthread ausgeführt wird.


SuziLoader verwenden

Dieser Loader lädt die Miniaturbilder für die Videos, die lokal im Hintergrund auf Ihrem Dateisystem gespeichert sind.

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

Um diese Abhängigkeit zu erhalten, führen Sie die folgenden Schritte aus

Schritt 1. Fügen Sie das JitPack-Repository zu Ihrer Build-Datei hinzu
Füge es in dein root build.gradle am Ende von Repositorys ein:

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

Schritt 2. Fügen Sie die Abhängigkeit hinzu

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

LESEN EXTERNE LAGERUNG HINZUFÜGEN Berechtigung im Manifest

<uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE"/>
0
Sushin Pv