Я разрабатываю приложение для 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
Как изменить декодирование плеера Exo или использовать HardwareBuffer ⇐ JAVA
Программисты JAVA общаются здесь
1737311592
Anonymous
Я разрабатываю приложение для Android, для которого требуется возможность воспроизведения видео с быстрой паузой и функцией воспроизведения.
Приложению необходимо воспроизводить определенный сегмент видео длительностью 1000 мс. p>
Однако у меня возникла проблема с ExoPlayer. Ему сложно обрабатывать видео очень короткой продолжительности: когда я пытаюсь воспроизвести такие фрагменты, [b]видео зависает на кадре, а звук воспроизводится без проблем[/b].
[b]У вас есть идеи, как это исправить?[/b]
Думаю, мне нужно воспроизвести видео с аппаратным декодированием, чтобы исправить это
Но я не знаю как
Или проблема во мне код:
[b]Способ создания плеера:[/b]
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();
Задача, которая иногда вызывает проблемы: [b]видео зависает на кадре, а звук воспроизводится без проблем[/b]
playerView.setOnClickListener(view -> {
playCurrent();
});
[b]playCurrent()[/b]
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();
}
}
[b]Прослушиватель игрока[/b]
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);
}
});
[b]stopRunnable[/b]
stopRunnable = () -> {
if (player.isPlaying()) {
player.pause();
}
};
[b]XML[/b]
Подробнее здесь: [url]https://stackoverflow.com/questions/79368169/how-to-change-exo-player-decoding-or-use-hardwarebuffer[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия