是否可以从android中的视频网址生成缩略图

Posted

技术标签:

【中文标题】是否可以从android中的视频网址生成缩略图【英文标题】:Is it possible to Generate a thumbnail from a video url in android 【发布时间】:2014-05-22 04:52:47 【问题描述】:

我正在开发一个视频应用程序。我正在从服务器链接流式传输视频,是否可以在不下载视频的情况下从 URL 生成视频缩略图。

【问题讨论】:

是 youtube 视频吗? 【参考方案1】:

无需下载视频,您可以从以下代码生成缩略图:

public static Bitmap retriveVideoFrameFromVideo(String videoPath) throws Throwable

    Bitmap bitmap = null;
    MediaMetadataRetriever mediaMetadataRetriever = null;
    try
    
        mediaMetadataRetriever = new MediaMetadataRetriever();
        if (Build.VERSION.SDK_INT >= 14)
            mediaMetadataRetriever.setDataSource(videoPath, new HashMap<String, String>());
        else
            mediaMetadataRetriever.setDataSource(videoPath);
   //   mediaMetadataRetriever.setDataSource(videoPath);
        bitmap = mediaMetadataRetriever.getFrameAtTime();
     catch (Exception e) 
        e.printStackTrace();
        throw new Throwable("Exception in retriveVideoFrameFromVideo(String videoPath)" + e.getMessage());

     finally 
        if (mediaMetadataRetriever != null) 
            mediaMetadataRetriever.release();
        
    
    return bitmap;

注意: 视频存储为帧内和非帧内(图片帧)getFrameAtTime 将返回最近的非帧内帧作为位图。所以基本上它不会下载整个视频。

【讨论】:

@OmarRehman:欢迎您。我已经检查过了,没有任何延迟。 @lostintranslation 视频存储为帧内和非帧内(图片帧) getFrameAtTime 将返回最近的非帧内帧作为位图。所以基本上它不会下载整个视频。希望你能得到答案。 谢谢@KishuDroid,我做到了,但挑战在于,在 Lollipop 5 上加载需要太多时间,是否有任何酷库可以将 URL 视频加载到 RecyclerView 中 @LutaayaHuzaifahIdris:如果您从服务器获取视频链接,那么您还可以从服务器请求视频的缩略图,然后您可以将其加载到 recyclerview 中。这是加载视频的简单快捷方式。 @KishuDroid 我用你的代码..它工作得很好..但是有一个问题,当视频很短时,有时视频很短,然后缩略图不出来..只是空白 【参考方案2】:

我用 glide 试过了,效果很好,Glide 版本4.3.1

    GlideApp.with(context)
                .asBitmap()
                .load(FILE_URL)
                .diskCacheStrategy(DiskCacheStrategy.DATA)
                .into(iv_picture);

编辑:Glide 对我来说工作缓慢

某些视频的最佳答案没有给出结果,这是我的做法

MediaMetadataRetriever retriever = new MediaMetadataRetriever();
 //give YourVideoUrl below
retriever.setDataSource("YourVideoUrl", new HashMap<String, String>());
// this gets frame at 2nd second
Bitmap image = retriever.getFrameAtTime(2000000, MediaMetadataRetriever.OPTION_CLOSEST_SYNC); 
//use this bitmap image

【讨论】:

我认为完成后需要释放MediaMetadataRetriver。 -> 检索器.release() 您的第二个解决方案正在运行...谢谢并继续努力【参考方案3】:

无法从蒸汽链接创建缩略图,您必须从服务器显示它。最好在视频中上传缩略图。 使用以下代码生成缩略图

Bitmap bitmap = ThumbnailUtils.createVideoThumbnail("picturePath", MediaStore.Video.Thumbnails.MINI_KIND);

【讨论】:

此方法已弃用【参考方案4】:

这是你的链接:

    android: Is it possible to display video thumbnails? http://developer.android.com/reference/android/media/ThumbnailUtils.html

在我看来,服务器端应该从视频创建缩略图并通过您的服务传输缩略图视频图像。

【讨论】:

嗨,我可以从录制的视频中创建缩略图。但是在流式传输时可以吗?【参考方案5】:

您可以从服务器 URL 生成缩略图,如下所示

添加Glide Library然后像下面这样使用
RequestOptions requestOptions = new RequestOptions();
requestOptions.isMemoryCacheable();
requestOptions.override(70,70);             
Glide.with(context).setDefaultRequestOptions(requestOptions).load(model.getMediaURL()).into(myViewHolder.imageView);

【讨论】:

【参考方案6】:
Bitmap bitmap = ThumbnailUtils.createVideoThumbnail("VIDEO FILE ADDRESS", MediaStore.Video.Thumbnails.MINI_KIND);

【讨论】:

此方法已弃用【参考方案7】:

此方法将为您提供手机中所有视频文件的缩略图...随时提问

public static Bitmap[] getThumbnail(Context context)
        Uri uri=MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
        String[] projection=new String[]  MediaStore.Video.Thumbnails._ID ;
        Cursor ca = context.getContentResolver().query(uri, projection, null, null, null);
        Bitmap[] b=new Bitmap[ca.getCount()];
        int i=0;
        ca.moveToFirst();
        while(i<ca.getCount()) 
            int id = ca.getInt(ca.getColumnIndex(MediaStore.Video.Thumbnails._ID));
            b[i++]=MediaStore.Video.Thumbnails.getThumbnail(context.getContentResolver(),id, MediaStore.Images.Thumbnails.MINI_KIND, null );
            ca.moveToNext();
        
        ca.close();
        return b;
    

【讨论】:

【参考方案8】:

这是最好的解决方案

"https://img.youtube.com/vi/" + videoID + "/0.jpg"

这里是你从 youtube Url 获得的 videoID。

【讨论】:

【参考方案9】:

我们获取 Android 手机中的所有视频。 http://sunilkmrnishad.blogspot.in/2017/03/read-files-apps-photos-media-from.html

public class ThumbnailExtract extends AsyncTask<String, long[], Bitmap> 

    private final String videoUrl;
    private final ImageView mThumbnail;
    private final boolean mIsVideo;
    private MediaMetadataRetriever mmr;

    public ThumbnailExtract(String videoLocalUrl, ImageView thumbnail, boolean isVideo) 
        this.videoUrl = videoLocalUrl;
        mThumbnail = thumbnail;
        mIsVideo = isVideo;
        if (!isVideo) 
            mmr = new MediaMetadataRetriever();
        
    

    @Override
    protected Bitmap doInBackground(String... params) 
        if (!mIsVideo) 
            return getBitmap(videoUrl);
         else 
            return ThumbnailUtils.createVideoThumbnail(videoUrl,
                    MediaStore.Images.Thumbnails.MINI_KIND);
        
    

    @Override
    protected void onPostExecute(Bitmap thumb) 
        if (thumb != null) 
            mThumbnail.setImageBitmap(thumb);
        
    

    private Bitmap getBitmap(String fileUrl) 
        mmr.setDataSource(fileUrl);
        byte[] data = mmr.getEmbeddedPicture();
        Bitmap bitmap = null;
        // convert the byte array to a bitmap
        if (data != null) 
            bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);

        
        return bitmap != null ? ScalingUtilities.createScaledBitmap(bitmap, 40, 40, ScalingUtilities.ScalingLogic.FIT) : bitmap;
    

【讨论】:

以上是关于是否可以从android中的视频网址生成缩略图的主要内容,如果未能解决你的问题,请参考以下文章

如何创建从Android视频文件路径视频缩略图

从视频网址创建缩略图!

如何从 facebook 视频 url 中提取缩略图

从 iPhone SDK 中的视频 url 创建缩略图

如何从服务器创建视频网址的缩略图

Android:是不是可以显示视频缩略图?