调用 .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);
}
如果可行,请告诉我。
我的应用程序中有一项功能必须多次播放一个简短的音频文件,使用下面的代码我正在准备 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);
}
如果可行,请告诉我。