【发布时间】: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?
【问题讨论】: