Черный экран мигает при загрузке нового фрагмента с помощью ExoPlayer2 для воспроизведения нового видео - PullRequest
0 голосов
/ 31 мая 2018

Я хочу воспроизвести видео, которые я храню локально в моей папке res.Мне нужна возможность ExoPlayer2 изменять скорость воспроизведения.На практике я загружаю различные виды фрагментов в FrameLayout.Когда я хочу воспроизвести видео, я сначала создаю экземпляр ExoPlayer2 и загружаю в него новый медиа-файл.После этого я жду, пока проигрыватель не перейдет в состояние воспроизведения Player.READY, а затем загружаю свой новый фрагмент.В методе onCreateView() фрагмента я присоединяю SurfaceView фрагмента к экземпляру ExoPlayer.К сожалению, фрагмент воспроизводит черный экран примерно за 30-100 миллисекунд до воспроизведения моего видео, и я считаю, что такое поведение нежелательно для пользователя, и хочу, чтобы после визуализации фрагмента он сразу же начал воспроизводить видео.

Я загрузил свернутый пример в Github , чтобы проиллюстрировать проблему, а также создать тикет в хранилище ExoPlayer2.

Чтобы предоставить несколько строк кода примера:

Метод 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...