0

i have list of video Urls. i create thumbnails from them. These thumbnails are in form of bitmap.so what i tried

Glide.with(mContext)
                    .load(bitmap)
                    .into(mVideoThumbnail)

What i found from Here.We can do something like this.

Glide.with(mContext)
                    .load(url).asBitmap()
                    .into(mVideoThumbnail)

But above function is used for loading URL as bitmap. It doesn't take bitmap as parameter.

i also know that i can set directly bitmap into image as below mentioned

mVideoThumbnail.setImageBitmap(bitmap);

Above method works fine if i have to set thumbnail for single video but in case of multiple videos, it cause some performance issue.

i am sharing my code for fetching thumbnail as a bitmap and set into my ImageView. Is There any way to pass directly bitmap to Glide or any other options are available for reducing performance issue. Please Help

public class TopicInstructionViewHolder implements View.OnClickListener {
@BindView(R.id.iv_thumbnail)
ImageView mVideoThumbnail;
@BindView(R.id.iv_play_video)
ImageView mVideoPlayIcon;
@BindView(R.id.tv_instruction_name)
TextView mInstructionName;
private ITopicVideoPlayListener mTopicVideoPlayListener;
private Context mContext;
private String videoPath;
private int instructionId;
private boolean mHasVideoSeenBL;

public TopicInstructionViewHolder(View itemView,
                                  ITopicVideoPlayListener mTopicVideoPlayListener,
                                  Context mContext) {
    ButterKnife.bind(this, itemView);
    this.mTopicVideoPlayListener = mTopicVideoPlayListener;
    this.mContext = mContext;
}

public void setData(TopicInstructionDetail topicInstructionDetail) {

    String thumbnailPath = null;
    TopicInstructionTranslationDetail topicInstructionTranslationDetails = findTopicInstructionAsPerLang(topicInstructionDetail.getmTopicInstructionTranslationDetails());
    mVideoPlayIcon.setOnClickListener(this);
    videoPath = topicInstructionTranslationDetails.getmInstructionPath();
    mHasVideoSeenBL = topicInstructionDetail.isCompleteSeen();
    instructionId = topicInstructionTranslationDetails.getmInstructionId();
    mInstructionName.setText(topicInstructionTranslationDetails.getmInstructionName());
    thumbnailPath = (NetworkConstants.VIDEO_URL + topicInstructionTranslationDetails.getmThumbnailPath());

    new SampleAsyncTask().execute(NetworkConstants.VIDEO_URL+videoPath);
    if (topicInstructionDetail.isCompleteSeen()) {
        mVideoPlayIcon.setImageResource(R.drawable.check);
    } else {
        mVideoPlayIcon.setImageResource(R.drawable.ic_play);
    }

}

private TopicInstructionTranslationDetail findTopicInstructionAsPerLang(List<TopicInstructionTranslationDetail> topicInstructionTranslationDetails) {

    TopicInstructionTranslationDetail topicInstructionTranslationDetail = null;
    for (TopicInstructionTranslationDetail topicTranslation : topicInstructionTranslationDetails) {
        if (topicTranslation.getmLanguage().equals(AppPreferencesHelper.getInstance(mContext).getCurrentUserLanguage())) {
            topicInstructionTranslationDetail = topicTranslation;
        }
    }

    if (topicInstructionTranslationDetail == null) {
        topicInstructionTranslationDetail = findDefaultTopicInstruction(topicInstructionTranslationDetails);
    }
    return topicInstructionTranslationDetail;
}

private TopicInstructionTranslationDetail findDefaultTopicInstruction(List<TopicInstructionTranslationDetail> topicInstructionTranslationDetails) {

    TopicInstructionTranslationDetail topicInstructionDetail = null;
    for (TopicInstructionTranslationDetail topicTranslation : topicInstructionTranslationDetails) {
        if (topicTranslation.getmLanguage().equals(LanguageCode.getLanguageCode(LanguageCode.LANGUAGE_FIRST))) {
            topicInstructionDetail = topicTranslation;
        }
    }
    return topicInstructionDetail;
}

@Override
public void onClick(View view) {
    mTopicVideoPlayListener.playVideo(videoPath, instructionId, mHasVideoSeenBL);
}

//fetching bitmap from video url private class SampleAsyncTask extends AsyncTask {

    @Override
    protected Bitmap doInBackground(String... strings) {
        Bitmap bitmap = null;
        MediaMetadataRetriever mediaMetadataRetriever = null;
        try {
            mediaMetadataRetriever = new MediaMetadataRetriever();
            if (Build.VERSION.SDK_INT >= 14) {
                mediaMetadataRetriever.setDataSource(strings[0], new HashMap<String, String>());
            } else {
                mediaMetadataRetriever.setDataSource(strings[0]);
            }
            bitmap = mediaMetadataRetriever.getFrameAtTime(1, MediaMetadataRetriever.OPTION_CLOSEST);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (mediaMetadataRetriever != null) {
                mediaMetadataRetriever.release();
            }
        }
        return bitmap;
    }

    @Override
    protected void onPostExecute(Bitmap s) {
        super.onPostExecute(s);
        try {
            mVideoThumbnail.setImageBitmap(s);
           /* Glide.with(mContext)
                    .load(s).asBitmap()
                    .into(mVideoThumbnail);*/
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }
}

}

Zoe
  • 27,060
  • 21
  • 118
  • 148
Tarun
  • 1,192
  • 2
  • 11
  • 20

2 Answers2

0

Use Fresco Library instead of Glide.

You can use facebook fresco library instead of glide for smooth and efficient loading in list. Fresco library have pipeline techniques for loading the image thumbnail in list. Use Asynctask and fresco pipeline to get the Thumbnail from video and load it.

Check this answer, implemented solution for your problem.

Keerthivasan
  • 1,651
  • 1
  • 21
  • 47
0

You are using Glide v3. Glide v4 did add an option for loading Bitmap as Drawable. Docs here

Update to v4 require some more configuration, check here

Tam Huynh
  • 2,026
  • 1
  • 16
  • 20