0

我正在这个应用程序中开发新闻应用程序,在 recyclerview 中显示视频。所以我想显示视频第一帧(缩略图)图像,以便我可以将该图像设置为 recyclerview 中的 imageview。

我使用FFmpegMediaMetadataRetriever但我的 recyclerview 卡住了一段时间然后显示视频缩略图。

有没有其他解决方案?

这是我的代码

    public class RvHomeAdapter extends RecyclerView.Adapter<RvHomeAdapter.NewsHolder> {

    List<News> newsArrayList;
    private static Context context;
    private static long downloadReference;
    VideoRequestHandler videoRequestHandler;
    Picasso picassoInstance;

    public RvHomeAdapter(List<News> newsArrayList, Context context) {
        this.newsArrayList = newsArrayList;
        RvHomeAdapter.context = context;
      /*  videoRequestHandler = new VideoRequestHandler();
        picassoInstance = new Picasso.Builder(context.getApplicationContext())
                .addRequestHandler(videoRequestHandler)
                .build();*/
    }


    @Override
    public NewsHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.news_row, viewGroup, false);
        NewsHolder newsHolder = new NewsHolder(v);
        return newsHolder;
    }

    @Override
    public void onBindViewHolder(final NewsHolder holder, final int position) {


        if (newsArrayList.get(position).getType().equals("image")) {

            holder.btn_play.setBackgroundResource(R.drawable.image);

            try {
                Picasso.with(context)
                        .load(newsArrayList.get(position).getThumb_image())
                        .fit()
                        .into(holder.img_main);
            } catch (Exception e) {
                e.printStackTrace();
            }

        } else if (newsArrayList.get(position).getType().equals("video")) {

            try {

                /*try {
                    Picasso.with(context)
                            .load(newsArrayList.get(position).getThumb_image())
                            .fit()
                            .into(holder.img_main);
                } catch (Exception e) {
                    e.printStackTrace();
                }*/


                FFmpegMediaMetadataRetriever mmr = new FFmpegMediaMetadataRetriever();
                mmr.setDataSource(newsArrayList.get(position).getLink());
                mmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_ALBUM);
                mmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_ARTIST);
                Bitmap b = mmr.getFrameAtTime(2000000, FFmpegMediaMetadataRetriever.OPTION_CLOSEST); // frame at 2 seconds
//                byte [] artwork = mmr.getEmbeddedPicture();

                mmr.release();

                holder.img_main.setImageBitmap(b);


            } catch (Throwable throwable) {
                throwable.printStackTrace();
            }

            holder.btn_play.setBackgroundResource(R.drawable.video);
//            holder.img_main.setImageBitmap(null);


        }
//        Typeface font = Typeface.createFromAsset(context.getAssets(), "saumil_guj.ttf");
//        holder.tv_news.setTypeface(font);
        holder.tv_news.setText(newsArrayList.get(position).getTitle());


    }

    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
    }


    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();
            }
        }

        Log.e("", "retriveVideoFrameFromVideo: bitmap = " + bitmap);

        return bitmap;
    }


    @Override
    public int getItemCount() {
        return newsArrayList.size();
    }

    public class NewsHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        ImageView img_download, img_share, img_main;
        TextView tv_news;
        Button btn_play;
        private DownloadManager downloadManager;

        public NewsHolder(View itemView) {
            super(itemView);

            btn_play = (Button) itemView.findViewById(R.id.btn_play);
            img_download = (ImageView) itemView.findViewById(R.id.img_download);
            img_share = (ImageView) itemView.findViewById(R.id.img_share);
            tv_news = (TextView) itemView.findViewById(R.id.tv_news);
            img_main = (ImageView) itemView.findViewById(R.id.img_main);

            img_main.setImageDrawable(null);
            btn_play.setOnClickListener(this);
            img_download.setOnClickListener(this);
            img_share.setOnClickListener(this);
            img_main.setOnClickListener(this);

        }

        @Override
        public void onClick(View v) {
            if (v.getId() == img_download.getId()) {

                String link = newsArrayList.get(getAdapterPosition()).getLink();
                String FileType = link.substring(link.lastIndexOf(".") + 1);
                System.out.println(link.substring(link.lastIndexOf(".") + 1));


                if (newsArrayList.get(getAdapterPosition()).getType().equals("image")) {

                    File extStore = Environment.getExternalStorageDirectory();
                    File myFile = new File(extStore.getAbsolutePath() + "/Botad News/Images/" + newsArrayList.get(getAdapterPosition()).getTitle() + "." + FileType);

                    if (!myFile.exists()) {
                        if (ConnectivityReceiver.isConnected()) {
                            DownloadTask downloadTask = new DownloadTask(context);
                            downloadTask.execute(newsArrayList.get(getAdapterPosition()).getLink(), "" + newsArrayList.get(getAdapterPosition()).getTitle() + "." + FileType, newsArrayList.get(getAdapterPosition()).getType());
                        } else {
                            Toast.makeText(context, context.getString(R.string.please_connect_to_internet), Toast.LENGTH_SHORT).show();
                        }
                    } else {

                        new AlertDialog.Builder(context)
                                .setTitle(R.string.app_name)
                                .setMessage(R.string.file_already_exists)
                                .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int which) {
                                        // continue with delete
                                    }
                                })
                                .setIcon(R.mipmap.ic_launcher)
                                .show();

//                        Toast.makeText(context, "File already exists", Toast.LENGTH_SHORT).show();
                    }

                } else {

                    File extStore = Environment.getExternalStorageDirectory();
                    File myFile = new File(extStore.getAbsolutePath() + "/Botad News/Videos/" + newsArrayList.get(getAdapterPosition()).getTitle() + "." + FileType);

                    if (!myFile.exists()) {
                        if (ConnectivityReceiver.isConnected()) {
                            DownloadTask downloadTask = new DownloadTask(context);
                            downloadTask.execute(newsArrayList.get(getAdapterPosition()).getLink(), "" + newsArrayList.get(getAdapterPosition()).getTitle() + "." + FileType, newsArrayList.get(getAdapterPosition()).getType());
                        } else {
                            Toast.makeText(context, context.getString(R.string.please_connect_to_internet), Toast.LENGTH_SHORT).show();
                        }
                    } else {

                        new AlertDialog.Builder(context)
                                .setTitle(R.string.app_name)
                                .setMessage("File already exists !")
                                .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int which) {
                                        // continue with delete
                                    }
                                })
                                .setIcon(R.mipmap.ic_launcher)
                                .show();

//                        Toast.makeText(context, "File already exists", Toast.LENGTH_SHORT).show();
                    }

                }


            } else if (v.getId() == img_share.getId()) {


                if (newsArrayList.get(getAdapterPosition()).getType().equals("video")) {

                    Intent intent = new Intent();
                    intent.setAction(Intent.ACTION_SEND);
//                    intent.setType("text/plain");
                    intent.setType("video/*");
                    intent.putExtra(Intent.EXTRA_TEXT, newsArrayList.get(getAdapterPosition()).getLink());
                    context.startActivity(Intent.createChooser(intent, "Share"));

                } else {

                    Intent intent = new Intent();
                    intent.setAction(Intent.ACTION_SEND);
//                    intent.setType("text/plain");
                    intent.setType("image/*");
                    intent.putExtra(Intent.EXTRA_TEXT, newsArrayList.get(getAdapterPosition()).getLink());
                    context.startActivity(Intent.createChooser(intent, "Share"));

                }


            } else if (v.getId() == btn_play.getId()) {

                if (newsArrayList.get(getAdapterPosition()).getType().contains("image")) {
//                    Toast.makeText(v.getContext(), "button image", Toast.LENGTH_SHORT).show();
                    Bundle gameData = new Bundle();
                    gameData.putString("file", newsArrayList.get(getAdapterPosition()).getLink());

                    Intent intent = new Intent(context, ImageViewActivity.class);
                    intent.putExtras(gameData);
                    context.startActivity(intent);

                } else {
                    if (ConnectivityReceiver.isConnected()) {
                        Bundle gameData = new Bundle();
                        gameData.putString("file", newsArrayList.get(getAdapterPosition()).getLink());
//                    Toast.makeText(v.getContext(), "button video", Toast.LENGTH_SHORT).show();
                        Intent intent = new Intent(context, VideoViewActivity.class);
                        intent.putExtras(gameData);
                        context.startActivity(intent);
                    } else {
                        Toast.makeText(context, context.getString(R.string.please_connect_to_internet), Toast.LENGTH_SHORT).show();
                    }
                }

            } else {
//                Toast.makeText(v.getContext(), "ROW PRESSED = " + String.valueOf(getAdapterPosition()), Toast.LENGTH_SHORT).show();
            }
        }


    }


}
4

0 回答 0