在android中是否可以从视频url生成缩略图

在android中是否可以从视频url生成缩略图,android,thumbnails,android-video-player,Android,Thumbnails,Android Video Player,我正在开发一个视频应用程序。我正在从服务器链接流式传输视频,是否可以在不下载视频的情况下从URL生成视频缩略图。这是您的链接: 在我看来,服务器端应该从视频创建缩略图,并通过您的服务传输缩略图视频图像 无法从蒸汽链接创建缩略图,您必须从服务器显示缩略图。最好沿着视频上传缩略图。 使用下面的代码生成缩略图 Bitmap bitmap = ThumbnailUtils.createVideoThumbnail("picturePath", MediaStore.Video.Thumbnails

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

这是您的链接:



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

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

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

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

    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;
    }
    
    公共静态位图检索VideoFrameFromVideo(字符串视频路径)抛出可丢弃
    {
    位图=空;
    MediaMetadataRetriever MediaMetadataRetriever=null;
    尝试
    {
    mediaMetadataRetriever=新的mediaMetadataRetriever();
    如果(Build.VERSION.SDK_INT>=14)
    setDataSource(videoPath,newhashmap());
    其他的
    mediaMetadataRetriever.setDataSource(videoPath);
    //mediaMetadataRetriever.setDataSource(videoPath);
    位图=mediaMetadataRetriever.getFrameAtTime();
    }捕获(例外e){
    e、 printStackTrace();
    抛出新的Throwable(“RetrieveVideoFrameFromVideo(String videoPath)中的异常)”+e.getMessage();
    }最后{
    if(mediaMetadataRetriever!=null){
    mediaMetadataRetriever.release();
    }
    }
    返回位图;
    }
    

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

    我们在Android手机中获取所有视频

    public类ThumbnailExtract扩展异步任务{
    私有最终字符串videoUrl;
    私人最终图像视图缩略图;
    私人视频;
    私有媒体元数据检索器mmr;
    公共缩略图提取(字符串videoLocalUrl、ImageView缩略图、布尔值isVideo){
    this.videoUrl=videoLocalUrl;
    mThumbnail=缩略图;
    mIsVideo=isVideo;
    如果(!isVideo){
    mmr=新的MediaMetadataRetriever();
    }
    }
    @凌驾
    受保护位图doInBackground(字符串…参数){
    如果(!错误视频){
    返回getBitmap(videoUrl);
    }否则{
    返回ThumbnailUtils.createVideoThumbnail(videoUrl,
    MediaStore、图像、缩略图、迷你型);
    }
    }
    @凌驾
    受保护的void onPostExecute(位图拇指){
    if(thumb!=null){
    mThumbnail.setImageBitmap(拇指);
    }
    }
    私有位图getBitmap(字符串文件URL){
    mmr.setDataSource(fileUrl);
    字节[]数据=mmr.getEmbeddedPicture();
    位图=空;
    //将字节数组转换为位图
    如果(数据!=null){
    位图=位图工厂.decodeByteArray(数据,0,数据.length);
    }
    返回位图!=null?ScalingUtilities.createScaledBitmap(位图,40,40,ScalingUtilities.ScalingLogic.FIT):位图;
    }
    }
    
    我用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
    
    MediaMetadataRetriever retriever=新的MediaMetadataRetriever();
    //在下面提供您的视频URL
    setDataSource(“YourVideoUrl”,newHashMap());
    //这是第二秒的帧
    位图图像=retriever.getFrameAtTime(2000000,MediaMetadataRetriever.OPTION\u CLOSEST\u SYNC);
    //使用此位图图像
    
    试着用这个

    Bitmap Bitmap=ThumbnailUtils.createvideo缩略图(“视频文件
    
    地址“,MediaStore.视频.缩略图.迷你型)

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

    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;
        }
    
    publicstaticbitmap[]getThumbnail(上下文){
    Uri Uri=MediaStore.Video.Media.EXTERNAL\u CONTENT\u Uri;
    字符串[]投影=新字符串[]{MediaStore.Video.Thumbnails.\u ID};
    游标ca=context.getContentResolver().query(uri、投影、null、null、null);
    位图[]b=新位图[ca.getCount()];
    int i=0;
    ca.moveToFirst();
    
    而(i您可以从服务器URL生成缩略图,如下所示

    • 添加然后像下面这样使用

    这是最好的解决办法

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


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

    您好,我可以从录制的视频中创建缩略图。但在流媒体播放时可以吗?这是youtube视频吗?@OmarRehman:欢迎。我已经检查过了,没有任何延迟。@lostintranslation视频存储为帧内和非帧内(图片帧)getFrameAtTime将以位图的形式返回最接近的非帧内帧。因此它基本上不会下载整个视频。希望你得到你的答案。谢谢@KishuDroid,我做到了,但这方面的挑战是,在棒棒糖5上加载要花太多时间,没有任何很酷的库将URL视频加载到RecyclerView@LutaayaHuzaifahIdris:如果您正在从服务器获取视频链接,然后您也可以从服务器请求视频的缩略图图像,然后您可以将其加载到recyclerview中。这是加载视频的简单而快速的方法。@KishuDroid我使用您的代码。.它可以正常工作。.但是有一个问题,当视频很短时,有时视频很短,然后缩略图就不会出现out..只需空白此方法已被弃用此方法已弃用我认为需要在完成后释放MediaMetadataRetriever。->retriever.release()
    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;
        }
    
    RequestOptions requestOptions = new RequestOptions();
    requestOptions.isMemoryCacheable();
    requestOptions.override(70,70);             
    Glide.with(context).setDefaultRequestOptions(requestOptions).load(model.getMediaURL()).into(myViewHolder.imageView);