fix: cap ExoPlayer buffer size
This commit is contained in:
@@ -36,6 +36,7 @@ import androidx.media3.common.Tracks
|
||||
import androidx.media3.common.VideoSize
|
||||
import androidx.media3.common.util.UnstableApi
|
||||
import androidx.media3.datasource.DefaultDataSource
|
||||
import androidx.media3.exoplayer.DefaultLoadControl
|
||||
import androidx.media3.exoplayer.DefaultRenderersFactory
|
||||
import androidx.media3.exoplayer.ExoPlayer
|
||||
import androidx.media3.exoplayer.source.DefaultMediaSourceFactory
|
||||
@@ -202,7 +203,7 @@ class ExoPlayerCore(private val activity: Activity) : Player.Listener {
|
||||
}
|
||||
}
|
||||
|
||||
fun initialize(): Boolean {
|
||||
fun initialize(bufferSizeBytes: Int? = null): Boolean {
|
||||
if (isInitialized) {
|
||||
Log.d(TAG, "Already initialized")
|
||||
return true
|
||||
@@ -337,8 +338,17 @@ class ExoPlayerCore(private val activity: Activity) : Player.Listener {
|
||||
|
||||
val wrappedRenderersFactory = AssRenderersFactory(handler, renderersFactory)
|
||||
|
||||
val loadControl = DefaultLoadControl.Builder().apply {
|
||||
if (bufferSizeBytes != null && bufferSizeBytes > 0) {
|
||||
setTargetBufferBytes(bufferSizeBytes)
|
||||
setPrioritizeTimeOverSizeThresholds(false)
|
||||
Log.d(TAG, "Buffer byte limit set to ${bufferSizeBytes / 1024 / 1024}MB")
|
||||
}
|
||||
}.build()
|
||||
|
||||
exoPlayer = ExoPlayer.Builder(activity)
|
||||
.setTrackSelector(trackSelector!!)
|
||||
.setLoadControl(loadControl)
|
||||
.setAudioAttributes(audioAttributes, false) // We handle audio focus manually
|
||||
.setMediaSourceFactory(mediaSourceFactory)
|
||||
.setRenderersFactory(wrappedRenderersFactory)
|
||||
|
||||
@@ -96,7 +96,7 @@ class ExoPlayerPlugin : FlutterPlugin, MethodChannel.MethodCallHandler,
|
||||
|
||||
override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {
|
||||
when (call.method) {
|
||||
"initialize" -> handleInitialize(result)
|
||||
"initialize" -> handleInitialize(call, result)
|
||||
"dispose" -> handleDispose(result)
|
||||
"open" -> handleOpen(call, result)
|
||||
"play" -> handlePlay(result)
|
||||
@@ -125,7 +125,7 @@ class ExoPlayerPlugin : FlutterPlugin, MethodChannel.MethodCallHandler,
|
||||
}
|
||||
}
|
||||
|
||||
private fun handleInitialize(result: MethodChannel.Result) {
|
||||
private fun handleInitialize(call: MethodCall, result: MethodChannel.Result) {
|
||||
val currentActivity = activity
|
||||
if (currentActivity == null) {
|
||||
result.error("NO_ACTIVITY", "Activity not available", null)
|
||||
@@ -138,12 +138,14 @@ class ExoPlayerPlugin : FlutterPlugin, MethodChannel.MethodCallHandler,
|
||||
return
|
||||
}
|
||||
|
||||
val bufferSizeBytes = call.argument<Int>("bufferSizeBytes")
|
||||
|
||||
currentActivity.runOnUiThread {
|
||||
try {
|
||||
playerCore = ExoPlayerCore(currentActivity).apply {
|
||||
delegate = this@ExoPlayerPlugin
|
||||
}
|
||||
val success = playerCore?.initialize() ?: false
|
||||
val success = playerCore?.initialize(bufferSizeBytes = bufferSizeBytes) ?: false
|
||||
|
||||
// Start hidden
|
||||
playerCore?.setVisible(false)
|
||||
|
||||
@@ -9,6 +9,8 @@ class PlayerAndroid extends PlayerBase {
|
||||
static const _methodChannel = MethodChannel('com.plezy/exo_player');
|
||||
static const _eventChannel = EventChannel('com.plezy/exo_player/events');
|
||||
|
||||
int? _bufferSizeBytes;
|
||||
|
||||
@override
|
||||
MethodChannel get methodChannel => _methodChannel;
|
||||
|
||||
@@ -46,7 +48,9 @@ class PlayerAndroid extends PlayerBase {
|
||||
if (initialized) return;
|
||||
|
||||
try {
|
||||
final result = await methodChannel.invokeMethod<bool>('initialize');
|
||||
final result = await methodChannel.invokeMethod<bool>('initialize', {
|
||||
'bufferSizeBytes': _bufferSizeBytes,
|
||||
});
|
||||
initialized = result == true;
|
||||
if (!initialized) {
|
||||
throw Exception('Failed to initialize ExoPlayer');
|
||||
@@ -181,6 +185,9 @@ class PlayerAndroid extends PlayerBase {
|
||||
case 'speed':
|
||||
await setRate(double.tryParse(value) ?? 1.0);
|
||||
break;
|
||||
case 'demuxer-max-bytes':
|
||||
_bufferSizeBytes = int.tryParse(value);
|
||||
break;
|
||||
// Other properties are no-ops for ExoPlayer
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user