Die App muss ein bestimmtes 1000-ms-Segment des Videos abspielen.
Ich habe jedoch ein Problem mit ExoPlayer. Es ist schwierig, Videos mit sehr kurzer Dauer zu verarbeiten – wenn ich versuche, solche Segmente abzuspielen, friert das Video auf einem Frame ein, während der Ton ohne Probleme abgespielt wird.
Haben Sie eine Idee, wie man das Problem beheben kann?
Ich glaube, ich muss mein Video mit Hardware-Dekodierung abspielen, um das Problem zu beheben
Aber ich weiß nicht wie
Oder das Problem liegt bei mir Code:
Die Art und Weise, wie ich den Player erstellt habe:
Code: Select all
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();
Code: Select all
playerView.setOnClickListener(view -> {
playCurrent();
});
Code: Select all
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();
}
}
Code: Select all
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);
}
});
Code: Select all
stopRunnable = () -> {
if (player.isPlaying()) {
player.pause();
}
};
Code: Select all