调用 .prepare() 几秒钟后使用 ExoPlayer 播放音频文件

Playing an audio file with ExoPlayer a few seconds after calling .prepare()

我的应用程序中有一项功能必须多次播放一个简短的音频文件,使用下面的代码我正在准备 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

我认为你的方向是正确的!

setPlayWhenReady 是您暂停和播放音频的方式,但只有在 "ready" 也就是准备好后才会真正播放。

所以您应该只需要在 onResume 或 onCreate 中调用您的 readyExoPlayerRaw 一次。然后在该方法的末尾,您可以设置 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);
}

如果可行,请告诉我。