9

Is it possible to get the thumbnail image from a video Url? I need to thumbnails of videos in a list view.

djot
  • 2,952
  • 4
  • 19
  • 28
QBLive
  • 313
  • 1
  • 5
  • 11
  • @user3726986 is it the ContentProvider Url or the Url like youtube? – SMR Feb 23 '15 at 11:23
  • Possible duplicate of [Is it possible to Generate a thumbnail from a video url in android](https://stackoverflow.com/questions/22954894/is-it-possible-to-generate-a-thumbnail-from-a-video-url-in-android) – Mehdi Dehghani Mar 28 '19 at 05:31

8 Answers8

8

Yes its possible to get the thumbnail of a video using ThumbnailUtils.

FileOutputStream out;
File land=new File(Environment.getExternalStorageDirectory().getAbsoluteFile()
                +"/portland.jpg");// image file use to create image u can give any path.
Bitmap bitmap=ThumbnailUtils.createVideoThumbnail(filePath, MediaStore.Video.Thumbnails.FULL_SCREEN_KIND);//filePath is your video file path.
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
        byte[] byteArray = stream.toByteArray();

        out=new  FileOutputStream(land.getPath());
        out.write(byteArray);
        out.close();
PiyushMishra
  • 5,743
  • 6
  • 37
  • 57
  • I can't use this line, It's showing error, File land=new File(Environment.getExternalStorageDirectory().getAbsoluteFile() +"/portland.jpg"); – Anitha Mar 30 '15 at 10:31
  • I am getting image from video URL then what i do ?..Please help me. – Ganpat Kaliya Sep 22 '15 at 12:35
  • Best unique solution, since unlike MINI_KIND and MICRO_KIND, the FULL_SCREEN_KIND is only stored on the db and impossible to access by URI path. – MPaulo Mar 24 '17 at 05:34
4

If you are specifically asking about youtube videos then there are automatically 4 generated images by Youtube.

http://img.youtube.com/vi/video_url_here/0.jpg
http://img.youtube.com/vi/video_url_here/1.jpg
http://img.youtube.com/vi/video_url_here/2.jpg
http://img.youtube.com/vi/video_url_here/3.jpg

Standard Image sizes

Player Background Thumbnail (480x360 pixels) http://i1.ytimg.com/vi/G0wGs3useV8/0.jpg

Start Thumbnail (120x90 pixels) http://i1.ytimg.com/vi/G0wGs3useV8/1.jpg

Middle Thumbnail (120x90 pixels) http://i1.ytimg.com/vi/G0wGs3useV8/2.jpg

End Thumbnail (120x90 pixels) http://i1.ytimg.com/vi/G0wGs3useV8/3.jpg

High Quality Thumbnail (480x360 pixels) http://i1.ytimg.com/vi/G0wGs3useV8/hqdefault.jpg

Medium Quality Thumbnail (320x180 pixels) http://i1.ytimg.com/vi/G0wGs3useV8/mqdefault.jpg

Normal Quality Thumbnail (120x90 pixels) http://i1.ytimg.com/vi/G0wGs3useV8/default.jpg

Standard Definition Thumbnail (640x480 pixels) http://i1.ytimg.com/vi/G0wGs3useV8/sddefault.jpg

Maximum Resolution Thumbnail (1920x1080 pixels) http://i1.ytimg.com/vi/G0wGs3useV8/maxresdefault.jpg

Murtaza Khursheed Hussain
  • 15,176
  • 7
  • 58
  • 83
3

It is 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 File

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
2

Try ThumbnailUtils, to get video bitmap from file path

ThumbnailUtils.createVideoThumbnail(filePath,MediaStore.Video.Thumbnails.MINI_KIND);
Lokesh
  • 3,247
  • 2
  • 33
  • 62
2

It is possible to get thumbnail image of video from video url.

If your video type is Vimeo follow below steps:

1)Suppose your Video Url is: http://player.vimeo.com/video/17314292

2)Get Video Id From Url : eg. 17314292

3)Call WS with Video id and XMl format http://vimeo.com/api/v2/video/17314292.xml

You will get "thumbnail_small","thumbnail_medium","thumbnail_large" in xml format for video thumb from video id

If your video type is YouTube follow below steps:

1)Video Url : http://www.youtube.com/embed/Nl2iMF0yKW8

2)Get Video Id From Url : eg. Nl2iMF0yKW8

3)Replace video id in this url http://i3.ytimg.com/vi/Nl2iMF0yKW8/default.jpg

NOTE:Just replace your id here.

1

To get thumbnail from the URL, i only got one solution till now, You have to use This library

It Supports file, http, https, mms, mmsh and rtmp protocols

and

It Supports aac, acc+, avi, flac, mp2, mp3, mp4, ogg, 3gp and more! formats (audio and video):

IshRoid
  • 3,696
  • 2
  • 26
  • 39
1

It's very important to identify the components of a problem. I'd actually say you have two separate problems:

  1. Downloading a file from an URL.

  2. Creating a thumbnail image from an incomplete video file.

Look into those two separately, you'll find plenty of information.

salezica
  • 74,081
  • 25
  • 105
  • 166
0

It is possible to get a thumbnail from a video file or url using FFMPEG.

FFMPEG must be built using the NDK (or you can find some Android built FFMPEG binaries). Here is a GitHub project to build FFMPEG:

https://github.com/guardianproject/android-ffmpeg

You can then include the FFMPEG binaries with your app and execute FFMPEG from code in your app to generate an image from the video (local or URL) using a command like:

ffmpeg -i videosite.com/video.flv -ss 00:00:15.000 -vframes 1 thumbnail_out.png

One thing to consider is at what seek time (option -ss) you grab the thumbnail for it to be a meaningful image that represents the video.

BrentM
  • 5,671
  • 3
  • 31
  • 38