22

I need to display a video thumbnail based to a URL into an ImageView view child of my ListView items, i have found this post but not worked.

Result

enter image description here

Code

        thumb_image.setImageBitmap(new LoadVideoThumbnail().execute(URLs.videos +"/"+videos.get(position).getId()+".mp4").get());

AsyncTask

public class LoadVideoThumbnail extends AsyncTask<String, Object, Bitmap>{

        @Override
        protected Bitmap doInBackground(String... objectURL) {
            //return ThumbnailUtils.createVideoThumbnail(objectURL[0], Thumbnails.MINI_KIND);
            return ThumbnailUtils.extractThumbnail(ThumbnailUtils.createVideoThumbnail(objectURL[0], Thumbnails.MINI_KIND), 100, 100);
        }

        @Override
        protected void onPostExecute(Bitmap result){
             //img.setImageBitmap(result);
        }

    }
Community
  • 1
  • 1
TooCool
  • 10,598
  • 15
  • 60
  • 85
  • 1
    Get the thumbnail from the server that is serving the video. Otherwise, I suspect that you will need to download the whole video to get a thumbnail. – CommonsWare May 07 '14 at 15:51
  • 1
    I'm just commenting as this isn't really an answer, but we use Picasso at work. http://square.github.io/picasso/ open source , easy to use and works on android really well. – Mike Docherty May 07 '14 at 17:07
  • @CommonsWare yes the thumbnail must be activated on the server side – TooCool May 07 '14 at 17:18
  • 1
    Then use Picasso or Ion or whatever to download the thumbnails from the server. – CommonsWare May 07 '14 at 17:24
  • use [Glide](https://github.com/bumptech/glide) or [UIL](https://github.com/nostra13/Android-Universal-Image-Loader) to create videos thumbnails. – hasnain_ahmad Jul 01 '16 at 09:25
  • 1
    Glide loads local Videos thumbnails @hasnain – Lutaaya Huzaifah Idris Nov 29 '16 at 11:11
  • May be try this https://stackoverflow.com/questions/30766885/glide-load-single-frame-from-video-at-specific-time/30769399#30769399 this work for me. – Heena M. Patel Jun 19 '17 at 07:40
  • Hpoe this link will help for video thumbnail from url. https://stackoverflow.com/questions/30766885/glide-load-single-frame-from-video-at-specific-time/30769399#30769399 – Heena M. Patel Jun 19 '17 at 07:42
  • Hope this url is useful for video thumbnail from video url https://stackoverflow.com/questions/30766885/glide-load-single-frame-from-video-at-specific-time/30769399#30769399 – Heena M. Patel Jun 19 '17 at 08:53

7 Answers7

13

With glide, i am use with Glide 4.8.0

  long thumb = getLayoutPosition()*1000;
  RequestOptions options = new RequestOptions().frame(thumb);
  Glide.with(getBaseContext()).load(url).apply(options).into(mThumb);
Wallace Roberto
  • 331
  • 3
  • 5
4

@CommonsWare,

This is not the case that for every video store individual thumbnail in server. but we have some library

fmmr.jar with using jniLibs

which directly provide the thumbnail from server url with in 10 second.

The sample code for Thumbnail.

FFmpegMediaMetadataRetriever fmmr = new FFmpegMediaMetadataRetriever();
        try {
            fmmr.setDataSource(videoPath);

            Bitmap b = fmmr.getFrameAtTime();

            if (b != null) {
                Bitmap b2 = fmmr.getFrameAtTime(4000000, FFmpegMediaMetadataRetriever.OPTION_CLOSEST_SYNC);
                if (b2 != null) {
                    b = b2;
                }
            }

            if (b != null) {
                Log.i("Thumbnail", "Extracted frame");
                return b;
            } else {
                Log.e("Thumbnail", "Failed to extract frame");
            }
        } catch (IllegalArgumentException ex) {
            ex.printStackTrace();
        } finally {
            fmmr.release();
        }
TejaDroid
  • 6,561
  • 4
  • 31
  • 38
1

Hello try this snippet working in my case

        Uri videoUri = data.getData();
        String selectedPathVideo="";
        selectedPathVideo = ImageFilePath.getPath(getApplicationContext(), videoUri);
        Log.i("Image File Path", ""+selectedPathVideo);

        try {
            Bitmap thumb = ThumbnailUtils.createVideoThumbnail(selectedPathVideo, MediaStore.Video.Thumbnails.MICRO_KIND);


            imgFarmerVideo.setImageBitmap(thumb);

        } catch (Exception e) {
            e.printStackTrace();
        }

The support class

public class ImageFilePath {
    /**
     * Method for return file path of Gallery image
     *
     * @param context
     * @param uri
     * @return path of the selected image file from gallery
     */
    public static String getPath(final Context context, final Uri uri)
    {

        //check here to KITKAT or new version
        final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;

        // DocumentProvider
        if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {

            // ExternalStorageProvider
            if (isExternalStorageDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];

                if ("primary".equalsIgnoreCase(type)) {
                    return Environment.getExternalStorageDirectory() + "/" + split[1];
                }
            }
            // DownloadsProvider
            else if (isDownloadsDocument(uri)) {

                final String id = DocumentsContract.getDocumentId(uri);
                final Uri contentUri = ContentUris.withAppendedId(
                        Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));

                return getDataColumn(context, contentUri, null, null);
            }
            // MediaProvider
            else if (isMediaDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];

                Uri contentUri = null;
                if ("image".equals(type)) {
                    contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                } else if ("video".equals(type)) {
                    contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
                } else if ("audio".equals(type)) {
                    contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                }

                final String selection = "_id=?";
                final String[] selectionArgs = new String[] {
                        split[1]
                };

                return getDataColumn(context, contentUri, selection, selectionArgs);
            }
        }
        // MediaStore (and general)
        else if ("content".equalsIgnoreCase(uri.getScheme())) {

            // Return the remote address
            if (isGooglePhotosUri(uri))
                return uri.getLastPathSegment();

            return getDataColumn(context, uri, null, null);
        }
        // File
        else if ("file".equalsIgnoreCase(uri.getScheme())) {
            return uri.getPath();
        }

        return null;
    }

    /**
     * Get the value of the data column for this Uri. This is useful for
     * MediaStore Uris, and other file-based ContentProviders.
     *
     * @param context The context.
     * @param uri The Uri to query.
     * @param selection (Optional) Filter used in the query.
     * @param selectionArgs (Optional) Selection arguments used in the query.
     * @return The value of the _data column, which is typically a file path.
     */
    public static String getDataColumn(Context context, Uri uri, String selection,
                                       String[] selectionArgs) {

        Cursor cursor = null;
        final String column = "_data";
        final String[] projection = {
                column
        };

        try {
            cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
                    null);
            if (cursor != null && cursor.moveToFirst()) {
                final int index = cursor.getColumnIndexOrThrow(column);
                return cursor.getString(index);
            }
        } finally {
            if (cursor != null)
                cursor.close();
        }
        return null;
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is ExternalStorageProvider.
     */
    public static boolean isExternalStorageDocument(Uri uri) {
        return "com.android.externalstorage.documents".equals(uri.getAuthority());
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is DownloadsProvider.
     */
    public static boolean isDownloadsDocument(Uri uri) {
        return "com.android.providers.downloads.documents".equals(uri.getAuthority());
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is MediaProvider.
     */
    public static boolean isMediaDocument(Uri uri) {
        return "com.android.providers.media.documents".equals(uri.getAuthority());
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is Google Photos.
     */
    public static boolean isGooglePhotosUri(Uri uri) {
        return "com.google.android.apps.photos.content".equals(uri.getAuthority());
    }
}
Pratik Vyas
  • 644
  • 7
  • 20
1

Use android ThumbnailUtils class

  public static Bitmap getThumblineImage(String videoPath) {
    return ThumbnailUtils.createVideoThumbnail(videoPath, MINI_KIND);
  }
1

Below is Kotlin code to get thumbnail from the video path.

fun retrieveVideoFrameFromVideo(videoPath: String?): Bitmap? {
    var bitmap: Bitmap? = null
    var mediaMetadataRetriever: MediaMetadataRetriever? = null
    try {
        mediaMetadataRetriever = MediaMetadataRetriever()
        mediaMetadataRetriever.setDataSource(videoPath, HashMap<String, String>())
        bitmap = mediaMetadataRetriever.frameAtTime
    } catch (e: Exception) {
        e.printStackTrace()
    } finally {
        mediaMetadataRetriever?.release()
    }
    return bitmap
}

Call method as below.

val bm = retrieveVideoFrameFromVideo(model.FilePath)
imgPreview.setImageBitmap(bm)
Kalu Khan Luhar
  • 1,044
  • 1
  • 22
  • 35
0

You can use Glide to load the thumbnail of video web URL.

  Glide.with(binding.getRoot().getContext())
                        .load("https://www.example.sample-mp4-file.mp4")
                        .diskCacheStrategy(DiskCacheStrategy.ALL)
                        .into(binding.ivThumbnail);
iamnaran
  • 1,894
  • 2
  • 15
  • 24
-3

To display a bitmap preview of a video, just set the video path of the VideoView and let the stream buffer.

For example:

videoView.setVideoPath("/sdcard/myawesomevideo.mp4");

In a few seconds you will see the first frame of the video.