Воспроизведение аудиофайла с ExoPlayer через несколько секунд после вызова .prepare () - PullRequest
0 голосов
/ 20 ноября 2018

В моем приложении есть функция, которая должна воспроизводить один короткий аудиофайл несколько раз, и, используя код ниже, я готовлю 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, не готовя его снова?

1 Ответ

0 голосов
/ 24 ноября 2018

Я думаю, что вы на правильном пути!

setPlayWhenReady - это то, как вы приостанавливаете и воспроизводите звук, но на самом деле он будет воспроизводиться только тогда, когда он «готов», то есть готовится.

Так что вам нужно всего лишь один раз вызвать readyExoPlayerRaw, вероятно, в onResume или onCreate.Затем в конце этого метода вы можете установить playWhenReady(false), чтобы он не начинал воспроизводиться, пока вы не скажете его.

Затем, когда вы хотите воспроизвести звук, сделайте что-то вроде следующего:

private void playSound() {
    // Go to the beginning of the audio (in case it has played before)
    player.seekTo(0);
    // Tell it to play the sound
    exoPlayer. setPlayWhenReady(true);
}

Дайте мне знать, если это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...