ExoPlayer,如何加载远程音频文件的更大部分
ExoPlayer, how to load bigger parts of remote audio files
我正在使用 ExoPlayer 2 播放远程曲目。默认情况下,播放器会逐段加载曲目(即大约 20 秒,然后在播放曲目时加载其他 20 秒)。
由于曲目是从远程服务器加载的,因此如果连接断开,播放器将无法再加载。有没有办法让 ExoPlayer 加载音频文件的更大部分(同时加载完整曲目)?
我试图查看 ExtractorMediaSource
、DataSource.Factory
和 DefaultExtractorsFactory
,但没有找到解决我问题的方法。
val audioSource = ExtractorMediaSource(
Uri.parse(videoUrl),
mDataSourceFactory, // DataSource.Factory
mExtractor, // DefaultExtractorsFactory
null,
null
)
mExoPlayer.prepare(audioSource)
mExoPlayer.playWhenReady = true
(它是 Kotlin,但似乎 Java 程序员也能理解)
我找到了解决方案。由于我没有找到其他相关问题,所以我会回答我的问题(希望以后有人需要):
要配置的正确对象是在创建 ExoPlayer
对象时传递给 ExoPlayerFactory
的 LoadControl
:
原始答案(已弃用):
val loadControl = DefaultLoadControl(
DefaultAllocator(true, C.DEFAULT_BUFFER_SEGMENT_SIZE),
5 * 60 * 1000, // this is it!
10 * 60 * 1000,
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS.toLong(),
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS.toLong()
)
exoPlayer = ExoPlayerFactory.newSimpleInstance(this, trackSelector, loadControl)
更新后的答案:
val bandwidthMeter = DefaultBandwidthMeter.Builder(context).build()
val trackSelectionFactory = AdaptiveTrackSelection.Factory()
val trackSelector = DefaultTrackSelector(trackSelectionFactory)
val loadControl = DefaultLoadControl.Builder()
.setAllocator(DefaultAllocator(true, C.DEFAULT_BUFFER_SEGMENT_SIZE))
.setBufferDurationsMs(
5 * 60 * 1000, // this is it!
10 * 60 * 1000,
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS,
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS
)
.setTargetBufferBytes(DefaultLoadControl.DEFAULT_TARGET_BUFFER_BYTES)
.setPrioritizeTimeOverSizeThresholds(DefaultLoadControl.DEFAULT_PRIORITIZE_TIME_OVER_SIZE_THRESHOLDS)
.createDefaultLoadControl()
exoPlayer = ExoPlayerFactory.newSimpleInstance(
context,
DefaultRenderersFactory(context),
trackSelector,
loadControl,
null,
bandwidthMeter)
The doc 哪里有解释。
@Massimo 的回答是正确的,但该方法已被弃用
使用类似这样的东西
DefaultLoadControl.Builder()
.setBufferDurationsMs(
DefaultLoadControl.DEFAULT_MIN_BUFFER_MS,
30_000,
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS,
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS
)
我正在使用 ExoPlayer 2 播放远程曲目。默认情况下,播放器会逐段加载曲目(即大约 20 秒,然后在播放曲目时加载其他 20 秒)。
由于曲目是从远程服务器加载的,因此如果连接断开,播放器将无法再加载。有没有办法让 ExoPlayer 加载音频文件的更大部分(同时加载完整曲目)?
我试图查看 ExtractorMediaSource
、DataSource.Factory
和 DefaultExtractorsFactory
,但没有找到解决我问题的方法。
val audioSource = ExtractorMediaSource(
Uri.parse(videoUrl),
mDataSourceFactory, // DataSource.Factory
mExtractor, // DefaultExtractorsFactory
null,
null
)
mExoPlayer.prepare(audioSource)
mExoPlayer.playWhenReady = true
(它是 Kotlin,但似乎 Java 程序员也能理解)
我找到了解决方案。由于我没有找到其他相关问题,所以我会回答我的问题(希望以后有人需要):
要配置的正确对象是在创建 ExoPlayer
对象时传递给 ExoPlayerFactory
的 LoadControl
:
原始答案(已弃用):
val loadControl = DefaultLoadControl(
DefaultAllocator(true, C.DEFAULT_BUFFER_SEGMENT_SIZE),
5 * 60 * 1000, // this is it!
10 * 60 * 1000,
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS.toLong(),
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS.toLong()
)
exoPlayer = ExoPlayerFactory.newSimpleInstance(this, trackSelector, loadControl)
更新后的答案:
val bandwidthMeter = DefaultBandwidthMeter.Builder(context).build()
val trackSelectionFactory = AdaptiveTrackSelection.Factory()
val trackSelector = DefaultTrackSelector(trackSelectionFactory)
val loadControl = DefaultLoadControl.Builder()
.setAllocator(DefaultAllocator(true, C.DEFAULT_BUFFER_SEGMENT_SIZE))
.setBufferDurationsMs(
5 * 60 * 1000, // this is it!
10 * 60 * 1000,
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS,
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS
)
.setTargetBufferBytes(DefaultLoadControl.DEFAULT_TARGET_BUFFER_BYTES)
.setPrioritizeTimeOverSizeThresholds(DefaultLoadControl.DEFAULT_PRIORITIZE_TIME_OVER_SIZE_THRESHOLDS)
.createDefaultLoadControl()
exoPlayer = ExoPlayerFactory.newSimpleInstance(
context,
DefaultRenderersFactory(context),
trackSelector,
loadControl,
null,
bandwidthMeter)
The doc 哪里有解释。
@Massimo 的回答是正确的,但该方法已被弃用
使用类似这样的东西
DefaultLoadControl.Builder()
.setBufferDurationsMs(
DefaultLoadControl.DEFAULT_MIN_BUFFER_MS,
30_000,
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS,
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS
)