使用ExoPlayer2加载新片段以播放新视频时,黑屏会闪烁

时间:2018-05-31 20:08:40

标签: android android-fragments surfaceview exoplayer exoplayer2.x

我想播放本地存储在res - 文件夹中的视频。我需要ExoPlayer2改变播放速度的能力。在实践中,我将不同类型的片段加载到FrameLayout中。 当我想播放视频时,我首先创建一个ExoPlayer2实例并将新媒体文件加载到其中。然后,我等到播放器处于播放状态Player.READY,然后加载我的新片段。在片段的onCreateView() - 方法中,我将片段的SurfaceView附加到ExoPlayer实例。 不幸的是,在播放我的视频之前,片段会在30到100毫秒内闪烁黑屏,我认为这种行为对于用户体验来说是不受欢迎的,并且希望在片段呈现后立即开始播放视频。

我将最小化的示例上传到Github以说明问题,并在ExoPlayer2的存储库中创建ticket

提供示例代码的几行:

片段中的onCreateView()方法:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.videolayout, container, false);
    mContext = inflater.getContext();
    MainActivity activity = (MainActivity) getActivity();
    mPlayer = activity.getPlayer();

    mPlayer.setVideoSurfaceView((SurfaceView) view.findViewById(R.id.surface_view1));
    mPlayer.setPlayWhenReady(true);

    return view;
}

加载新视频文件的功能:

private void playVideo(Context context, String name){
    final int raw_res_id = context.getResources().getIdentifier(
            name,
            "raw",
            context.getPackageName());
    MediaSource media_source = new ExtractorMediaSource.Factory(getDataSourceFactory()).createMediaSource(
            RawResourceDataSource.buildRawResourceUri(raw_res_id));
    mPlayer.prepare(media_source);
    mPlayer.setPlayWhenReady(false);
}

加载新片段的函数:

private void waitTillReady(){
    if (mPlayer.getPlaybackState() == Player.STATE_READY){
        createNewFragment();
    }
    else{
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                waitTillReady();
            }
        }, 10);
    }
}

private void createNewFragment() {
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.replace(R.id.contentFragment, new VideoFragment());
    ft.commit();
}

0 个答案:

没有答案