【问题标题】:Playing an audio file with ExoPlayer a few seconds after calling .prepare()调用 .prepare() 几秒钟后使用 ExoPlayer 播放音频文件
【发布时间】:2019-04-22 17:45:47
【问题描述】:

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

【问题讨论】:

    标签: android audio exoplayer


    【解决方案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);
    }
    

    让我知道这是否有效。

    【讨论】:

      猜你喜欢
      • 2021-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-31
      • 1970-01-01
      相关资源
      最近更新 更多