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

时间:2018-11-20 09:53:38

标签: android audio exoplayer

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

我认为您在正确的轨道上!

setPlayWhenReady是您暂停和播放音频的方式,但实际上只有在“准备就绪”即准备就绪时才能播放。

因此,您只需在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);
}

让我知道是否可行。