我的应用程序中具有一项功能,该功能必须多次播放一个简短的音频文件,并且使用下面的代码,我正在准备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
而又没有准备呢?
答案 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);
}
让我知道是否可行。