Я хочу воспроизвести видео, которые я храню локально в моей папке 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();
}