Exoplayer Recyclerview 第二次播放错误的视频

Posted

技术标签:

【中文标题】Exoplayer Recyclerview 第二次播放错误的视频【英文标题】:Exoplayer Recyclerview Playing Wrong Video Second Time 【发布时间】:2020-07-09 02:55:36 【问题描述】:

我已经在回收站视图中实现了 Exoplayer。假设有两个视频,当我播放第一个视频时,它可以正常播放。

当我在暂停第一个视频后播放第二个视频时,它可以正常播放。但是第一个视频的时间栏开始了,如果我从第一个视频视图暂停视频,第二个视频就会暂停(能够从第一个视频控制器控制第二个视频)

现在,如果我暂停第二个视频并播放第一个视频,它只会播放第二个视频,并且能够从两个视频控制器控制此视频。

请看下面的回收站查看代码:

public class ChatsCursorAdapter extends RecyclerView.Adapter<ChatsCursorAdapter.ChatsHolder> 

    public SimpleExoPlayer exoPlayer;
    private Cursor mCursor;
    private Context mContext;

    public ChatsCursorAdapter(Cursor mCursor,
                              Context mContext) 
        this.mCursor = mCursor;
        this.mContext = mContext;
    

    @NonNull
    @Override
    public ChatsHolder onCreateViewHolder(@NonNull ViewGroup viewGroup,
                                          int i) 

        View V = LayoutInflater.from(viewGroup.getContext())
                               .inflate(R.layout.list_chat_message,
                                        viewGroup,
                                        false);

        // Build The Exoplayer
        exoPlayer = new SimpleExoPlayer.Builder(mContext).build();

        return new ChatsHolder(V);
    

    @Override
    public void onBindViewHolder(@NonNull final ChatsHolder chatsHolder,
                                 final int i) 

        String url = mCursor.getString(mCursor.getColumnIndex("url"));

        // Play Video When Play Button Clicked
        chatsHolder.ivSharedImage.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 

                try 

                    Uri videoUri = Uri.parse(url);

                    chatsHolder.sevSharedVideo.setPlayer(exoPlayer);

                    // Produces DataSource instances through which media data is loaded.
                    DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(mContext,
                                                                                        Util.getUserAgent(mContext,
                                                                                                          "Dackeree"));
                    // This is the MediaSource representing the media to be played.
                    MediaSource videoSource = new ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(videoUri);
                    // Prepare the player with the source.

                    exoPlayer.prepare(videoSource);
                    exoPlayer.setPlayWhenReady(true);
                 catch (Exception e) 

                    Toast.makeText(mContext,
                                   "Some Error Occurred...",
                                   Toast.LENGTH_SHORT)
                         .show();
                
            
        );
    

    @Override
    public int getItemCount() 

        return mCursor.getCount();
    

    public class ChatsHolder extends RecyclerView.ViewHolder 

        final ImageView ivSharedImage;
        final PlayerView sevSharedVideo;

        ChatsHolder(View view) 

            super(view);

            ivSharedImage = view.findViewById(R.id.l_chat_message_iv_shared_image);
            sevSharedVideo = view.findViewById(R.id.l_chat_message_sev_shared_video);
        
    

SimpleExoplyer exoplyer 是公开的,因此它可以从其他活动 onStop、onPause 中停止/释放。这样视频在离开活动后就不会继续播放了。

请帮助我,让每个视频都能正常播放。

【问题讨论】:

youtube.com/watch?v=mqc0CR9UvIU recyclerview 中 exoplayer 的完整工作示例 【参考方案1】:

我在 Kotlin 中创建了一个具有不同功能的 repo,其中一个是我从该视频中提取的视频中的 Recyclerview:https://www.youtube.com/watch?v=z44CLCafepA

【讨论】:

以上是关于Exoplayer Recyclerview 第二次播放错误的视频的主要内容,如果未能解决你的问题,请参考以下文章

Recyclerview 中的 Exoplayer 错误,源错误没有可用的提取器

RecyclerView 和 Firebase Storage 快速滚动 ExoPlayer 异常

如何用recyclerview和viewpager2实现exoplayer?

使用 exoplayer android 在 recyclerview 中显示视频

启用 Exoplayer Cache 后滑动缓慢加载

如何使用 videoPlayer 滚动 recyclerview 视频帧