如何使用Glide在Android中制作远程源的视频缩略图
如果可以在手机存储器中找到源,我可以使用Glide制作视频缩略图。但是,如果访问远程url而不是本地文件,则代码不起作用如何使用Glide在Android中制作远程源的视频缩略图,android,android-glide,Android,Android Glide,如果可以在手机存储器中找到源,我可以使用Glide制作视频缩略图。但是,如果访问远程url而不是本地文件,则代码不起作用 Glide.with(mContext) .load(message) .into(mVideoThumbnailView); 我正在尝试访问mp4文件。谢谢你的建议。我还没有尝试使用Glide。但是,如本文所述,您需要编写一个自定义模型和数据获取程序,以便使用Glide检索图像 然而,一种对我
Glide.with(mContext)
.load(message)
.into(mVideoThumbnailView);
我正在尝试访问mp4文件。谢谢你的建议。我还没有尝试使用
Glide
。但是,如本文所述,您需要编写一个自定义模型和数据获取程序,以便使用Glide
检索图像
然而,一种对我有效的变通方法是使用。以下是我如何在不下载文件的情况下检索缩略图位图:
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;
}
公共静态位图从视频检索视频帧(字符串视频路径)
扔掉的
{
位图=空;
MediaMetadataRetriever MediaMetadataRetriever=null;
尝试
{
mediaMetadataRetriever=新的mediaMetadataRetriever();
如果(Build.VERSION.SDK_INT>=14)
setDataSource(videoPath,newhashmap());
其他的
mediaMetadataRetriever.setDataSource(videoPath);
//mediaMetadataRetriever.setDataSource(videoPath);
位图=mediaMetadataRetriever.getFrameAtTime();
}
捕获(例外e)
{
e、 printStackTrace();
扔新的一次性垃圾(
“RetrieveVideoFrameFromVideo(字符串视频路径)中出现异常”
+e.getMessage());
}
最后
{
if(mediaMetadataRetriever!=null)
{
mediaMetadataRetriever.release();
}
}
返回位图;
}
我发现一种非常肮脏的方法是播放视频的前100毫秒并暂停:
private void playSelectedVideoFrom(String url, boolean asThumbnail){
try {
Uri uri = Uri.parse(url);
video.setVideoURI(uri);
video.setOnPreparedListener(mediaPlayer -> {
if (!asThumbnail)
buffering.show();
mediaPlayer.setLooping(false);
mediaPlayer.start();
mediaPlayer.setVideoScalingMode(MediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT);
if (asThumbnail) {
mediaPlayer.seekTo(100);
mediaPlayer.setOnSeekCompleteListener(mediaPlayer1 -> {
mediaPlayer1.pause();
});
}else {
if (mediaPlayer.isPlaying()) buffering.hide();
}
});
}catch (Exception ex){
ex.printStackTrace();
}
}
它对我有用。什么类型的
消息
?确保它指向有效的资源。您好@OBX,您在哪里使用它?在一项活动中(这有关系吗)?我目前正在适配器中应用此功能。使用此代码,我收到了一个java.lang.IllegalArgumentException 02-07 18:23:13.150 12240-12240/com.woppi.myapp W/System.err:at android.media.mediatedataretriever.setDataSource(mediatedataretriever.java:73)02-07 18:23:13.150 12240-12240/com.woppi.myapp W/System.err:at com.woppi.myapp.RoomMessageAdapter.retrieveVideoFrameFromVideo(RoomMessageAdapter.java:635)
hmm,可能是权限问题,也可以尝试一下,让我知道您是否已经添加了权限!如果您使用的是更高的api,请降级版本,然后在没有运行时许可的情况下尝试。我有互联网、写入外部存储、读取外部存储、录制音频、摄像头
我使用的是api级别21,但应用程序应支持4.2.2 Jellybean及更高版本。也许MediaMetadataRetriever不支持https?您是否在SSL下检索文件时使用了此选项