Я разрабатываю приложение для Android, для которого требуется возможность воспроизведения видео с быстрой паузой и функцией воспроизведения.
Приложению необходимо воспроизводить определенный сегмент видео длительностью 1000 мс. p>
Однако у меня возникла проблема с ExoPlayer. Ему сложно обрабатывать видео очень короткой продолжительности: когда я пытаюсь воспроизвести такие фрагменты, видео зависает на кадре, а звук воспроизводится без проблем.
У вас есть идеи, как это исправить?
Думаю, мне нужно воспроизвести видео с аппаратным декодированием, чтобы исправить это
Но я не знаю как
Или проблема во мне код:
Способ создания плеера:
DefaultTrackSelector trackSelector = new DefaultTrackSelector(context);
trackSelector.setParameters(new DefaultTrackSelector.ParametersBuilder()
.setRendererDisabled(C.TRACK_TYPE_VIDEO, true)
.clearOverridesOfType(C.TRACK_TYPE_VIDEO)
.build()
);
player = new ExoPlayer.Builder(context)
.setTrackSelector(trackSelector)
.build();
playerView.setPlayer(player);
playerView.setUseController(false);
MediaItem mediaItem = new MediaItem.Builder()
.setUri(videoUri)
.build();
player.setMediaItem(mediaItem);
player.prepare();
Задача, которая иногда вызывает проблемы: видео зависает на кадре, а звук воспроизводится без проблем
playerView.setOnClickListener(view -> {
playCurrent();
});
playCurrent()
public void playCurrent(){
if (!player.isPlaying()) {
SubRipParserUtil.SubtitleEntry previousSubtitle = parser.getPreviousSubtitle(subtitle.countOfSubtitles,false);
if (previousSubtitle != null && subtitle.startTimeMs - previousSubtitle.endTimeMs > START_EXPAND_TIME) // if last subtitle was not close to current one, start the current play START_EXPAND_TIME Further back
player.seekTo(subtitle.startTimeMs - START_EXPAND_TIME);
else
player.seekTo(subtitle.startTimeMs);
endTimeMs = subtitle.endTimeMs;
player.play();
}
}
Прослушиватель игрока
player.addListener(new Player.Listener() {
@Override
public void onIsPlayingChanged(boolean isPlaying) {
if (isPlaying){
long duration = endTimeMs - player.getCurrentPosition();
handler.postDelayed(stopRunnable, duration);
}
Player.Listener.super.onIsPlayingChanged(isPlaying);
}
});
stopRunnable
stopRunnable = () -> {
if (player.isPlaying()) {
player.pause();
}
};
XML
Подробнее здесь: https://stackoverflow.com/questions/793 ... warebuffer