현재 ViewPager2 + recyclerview Adapter를 이용해서 페이징이 가능한 비디오플레이어를 만들고 있습니다.
서버에서 hls(.m3u8) uri를 불러와 플레이를 시키는데 처음엔 잘 됩니다.
다만 플레이가 20~30회 정도가 되면 그때부터 에러가 뜨고 블랙스크린이 뜨면서 플레이가 안되더라구요
에러를 봐도 어떻게 접근해야 하는지 몰라 글을 올립니다.
아 HLS는 서버에서 MP4 파일을 ffmpeg을 통해 .m3u8파일로 변환하고 있습니다.
MP4파일을 그대로 실행시켜도 같은 에러가 뜹니다..;;
ffmpeg코드 입니다.
ffmpeg -i ./vod/$vod.mp4 -vcodec libx264 -profile:v baseline -level 3.0 -s 640x640 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls ./vod/$vod.m3u8
어댑터부분 코드입니다.
public class PageAdapter extends RecyclerView.Adapter<PageAdapter.PGHolder>{
private ArrayList<ViewPager_Item> viewPagerItems;
public PageAdapter(ArrayList itemlist) ...
@NonNull
@Override
public PGHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) ....
@Override
public void onBindViewHolder(@NonNull PGHolder holder, int position) {
if(holder.player == null){
holder.player = ExoPlayerFactory.newSimpleInstance(getActivity());
holder.exoplayerview.setPlayer(holder.player);
}
if(viewPagerItems.size() > 0) {
Uri uri = Uri.parse(viewPagerItems.get(position).vod);
String userAgent = Util.getUserAgent(getActivity(), "MyApplication");
MediaSource mediaSource = new HlsMediaSource.Factory(new DefaultHttpDataSourceFactory(userAgent)).createMediaSource(uri);
LoopingMediaSource loopingMediaSource = new LoopingMediaSource(mediaSource);
holder.player.prepare(loopingMediaSource);
holder.player.seekTo(100);
}
}
@Override
public int getItemCount() {
return viewPagerItems.size();
}
@Override
public void onViewAttachedToWindow(@NonNull PGHolder holder) {
super.onViewAttachedToWindow(holder);
viewPager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
@Override
public void onPageSelected(int position) {
super.onPageSelected(position);
if(holder.getAdapterPosition() == position){
holder.player.setPlayWhenReady(true);
holder.layout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//holder.player.setPlayWhenReady(!holder.player.getPlayWhenReady());
if(holder.player.getPlayWhenReady()){ //play
holder.player.setPlayWhenReady(false);
holder.playimg.setVisibility(View.VISIBLE);
}else{ //puase
holder.player.setPlayWhenReady(true);
holder.playimg.setVisibility(View.GONE);
}
}
}); //setonclicklistener
}
}
});
}
@Override
public void onViewDetachedFromWindow(@NonNull PGHolder holder) {
super.onViewDetachedFromWindow(holder);
holder.player.setPlayWhenReady(false);
holder.player.seekTo(100);
}
public class PGHolder extends RecyclerView.ViewHolder{
public HashTagHelper mTextHashTagHelper;
public ConstraintLayout layout;
public PlayerView exoplayerview;
public SimpleExoPlayer player;
public PGHolder(final View itemView) {
super(itemView);
layout = (ConstraintLayout) itemView.findViewById(R.id.layout);
exoplayerview = itemView.findViewById(R.id.exoplayerview);
}//PGHolder
}
}