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