В моем приложении есть функция, которая должна воспроизводить один короткий аудиофайл несколько раз, и, используя код ниже, я готовлю ExoPlayer
для воспроизведения звука:
SimpleExoPlayer player;
private void readyExoPlayerRaw(int rawSound) {
player = ExoPlayerFactory.newSimpleInstance(this, new DefaultTrackSelector());
DataSpec dataSpec = new DataSpec(RawResourceDataSource.buildRawResourceUri(rawSound));
final RawResourceDataSource rawResourceDataSource = new RawResourceDataSource(this);
try {
rawResourceDataSource.open(dataSpec);
} catch (RawResourceDataSource.RawResourceDataSourceException e) {
e.printStackTrace();
}
MediaSource audioSource =
new ExtractorMediaSource.Factory(
new DefaultDataSourceFactory(this, "appName"))
.createMediaSource(rawResourceDataSource.getUri());
player.prepare(audioSource);
//player.setPlayWhenReady(true);
}
Проблема в том, чточто звук воспроизводится нормально, когда я раскомментирую последнюю строку (//player.setPlayWhenReady(true);
), но так как я играю звук через несколько секунд после запуска этого метода, эта строка кода не будет работать!Я думаю, потому что он ждет обратного вызова из предыдущей строки (.prepare(...)
), и когда он будет готов, он будет воспроизводиться.Поэтому я подумал, что, возможно, мне следует вызвать start()
или что-то подобное на проигрывателе, но такого метода просто нет.
Поэтому я застреваю с вызовом .prepare()
каждый раз, когда хочу воспроизвести аудио, но так как он воспроизводится с очень короткими интервалами, вызов prepare()
вызывает неподходящую задержку.
Так я что-то упустил?Как я могу сыграть в подготовленный MediaSource
, не готовя его снова?