Change:Audio stream buffer times #63

This commit is contained in:
advplyr 2021-12-19 12:40:52 -06:00
parent 0fcec4b861
commit 1a7f90c93b
3 changed files with 25 additions and 1 deletions

View file

@ -82,8 +82,10 @@ class MyNativeAudio : Plugin() {
fun getCurrentTime(call: PluginCall) { fun getCurrentTime(call: PluginCall) {
Handler(Looper.getMainLooper()).post() { Handler(Looper.getMainLooper()).post() {
var currentTime = playerNotificationService.getCurrentTime() var currentTime = playerNotificationService.getCurrentTime()
var bufferedTime = playerNotificationService.getBufferedTime()
val ret = JSObject() val ret = JSObject()
ret.put("value", currentTime) ret.put("value", currentTime)
ret.put("bufferedTime", bufferedTime)
call.resolve(ret) call.resolve(ret)
} }
} }

View file

@ -243,7 +243,15 @@ class PlayerNotificationService : MediaBrowserServiceCompat() {
ctx = this ctx = this
// Initialize player // Initialize player
var customLoadControl:LoadControl = DefaultLoadControl.Builder().setBufferDurationsMs(
1000 * 20, // 20s min buffer
1000 * 45, // 45s max buffer
1000 * 5, // 5s playback start
1000 * 20 // 20s playback rebuffer
).build()
var simpleExoPlayerBuilder = SimpleExoPlayer.Builder(this) var simpleExoPlayerBuilder = SimpleExoPlayer.Builder(this)
simpleExoPlayerBuilder.setLoadControl(customLoadControl)
simpleExoPlayerBuilder.setSeekBackIncrementMs(10000) simpleExoPlayerBuilder.setSeekBackIncrementMs(10000)
simpleExoPlayerBuilder.setSeekForwardIncrementMs(10000) simpleExoPlayerBuilder.setSeekForwardIncrementMs(10000)
mPlayer = simpleExoPlayerBuilder.build() mPlayer = simpleExoPlayerBuilder.build()
@ -694,6 +702,10 @@ class PlayerNotificationService : MediaBrowserServiceCompat() {
return currentPlayer.currentPosition return currentPlayer.currentPosition
} }
fun getBufferedTime() : Long {
return currentPlayer.bufferedPosition
}
fun getTheLastPauseTime() : Long { fun getTheLastPauseTime() : Long {
return lastPauseTime return lastPauseTime
} }

View file

@ -23,6 +23,7 @@
<div class="w-full"> <div class="w-full">
<div class="h-1 w-full bg-gray-500 bg-opacity-50 relative"> <div class="h-1 w-full bg-gray-500 bg-opacity-50 relative">
<div ref="totalReadyTrack" class="h-full bg-gray-600 absolute top-0 left-0 pointer-events-none" /> <div ref="totalReadyTrack" class="h-full bg-gray-600 absolute top-0 left-0 pointer-events-none" />
<div ref="totalBufferedTrack" class="h-full bg-gray-500 absolute top-0 left-0 pointer-events-none" />
<div ref="totalPlayedTrack" class="h-full bg-gray-200 absolute top-0 left-0 pointer-events-none" /> <div ref="totalPlayedTrack" class="h-full bg-gray-200 absolute top-0 left-0 pointer-events-none" />
</div> </div>
</div> </div>
@ -71,6 +72,7 @@
<div id="playerTrack" class="absolute bottom-0 left-0 w-full px-3"> <div id="playerTrack" class="absolute bottom-0 left-0 w-full px-3">
<div ref="track" class="h-2 w-full bg-gray-500 bg-opacity-50 relative" :class="loading ? 'animate-pulse' : ''" @click="clickTrack"> <div ref="track" class="h-2 w-full bg-gray-500 bg-opacity-50 relative" :class="loading ? 'animate-pulse' : ''" @click="clickTrack">
<div ref="readyTrack" class="h-full bg-gray-600 absolute top-0 left-0 pointer-events-none" /> <div ref="readyTrack" class="h-full bg-gray-600 absolute top-0 left-0 pointer-events-none" />
<div ref="bufferedTrack" class="h-full bg-gray-500 absolute top-0 left-0 pointer-events-none" />
<div ref="playedTrack" class="h-full bg-gray-200 absolute top-0 left-0 pointer-events-none" /> <div ref="playedTrack" class="h-full bg-gray-200 absolute top-0 left-0 pointer-events-none" />
</div> </div>
<div class="flex pt-0.5"> <div class="flex pt-0.5">
@ -114,6 +116,7 @@ export default {
totalDuration: 0, totalDuration: 0,
currentPlaybackRate: 1, currentPlaybackRate: 1,
currentTime: 0, currentTime: 0,
bufferedTime: 0,
isResetting: false, isResetting: false,
initObject: null, initObject: null,
streamId: null, streamId: null,
@ -430,19 +433,25 @@ export default {
updateTrack() { updateTrack() {
var percentDone = this.currentTime / this.totalDuration var percentDone = this.currentTime / this.totalDuration
var totalPercentDone = percentDone var totalPercentDone = percentDone
var bufferedPercent = this.bufferedTime / this.totalDuration
var totalBufferedPercent = bufferedPercent
if (this.useChapterTrack && this.currentChapter) { if (this.useChapterTrack && this.currentChapter) {
var currChapTime = this.currentTime - this.currentChapter.start var currChapTime = this.currentTime - this.currentChapter.start
percentDone = currChapTime / this.currentChapterDuration percentDone = currChapTime / this.currentChapterDuration
bufferedPercent = (this.bufferedTime - this.currentChapter.start) / this.currentChapterDuration
} }
var ptWidth = Math.round(percentDone * this.trackWidth) var ptWidth = Math.round(percentDone * this.trackWidth)
if (this.playedTrackWidth === ptWidth) { if (this.playedTrackWidth === ptWidth) {
return return
} }
this.$refs.playedTrack.style.width = ptWidth + 'px' this.$refs.playedTrack.style.width = ptWidth + 'px'
this.$refs.bufferedTrack.style.width = Math.round(bufferedPercent * this.trackWidth) + 'px'
this.playedTrackWidth = ptWidth this.playedTrackWidth = ptWidth
if (this.useChapterTrack) { if (this.useChapterTrack) {
this.$refs.totalPlayedTrack.style.width = Math.round(totalPercentDone * this.trackWidth) + 'px' this.$refs.totalPlayedTrack.style.width = Math.round(totalPercentDone * this.trackWidth) + 'px'
this.$refs.totalBufferedTrack.style.width = Math.round(totalBufferedPercent * this.trackWidth) + 'px'
} }
}, },
seek(time) { seek(time) {
@ -511,6 +520,7 @@ export default {
}, },
async set(audiobookStreamData, stream, fromAppDestroy) { async set(audiobookStreamData, stream, fromAppDestroy) {
this.isResetting = false this.isResetting = false
this.bufferedTime = 0
this.streamId = stream ? stream.id : null this.streamId = stream ? stream.id : null
this.audiobookId = audiobookStreamData.audiobookId this.audiobookId = audiobookStreamData.audiobookId
this.initObject = { ...audiobookStreamData } this.initObject = { ...audiobookStreamData }
@ -601,7 +611,7 @@ export default {
this.playInterval = setInterval(async () => { this.playInterval = setInterval(async () => {
var data = await MyNativeAudio.getCurrentTime() var data = await MyNativeAudio.getCurrentTime()
this.currentTime = Number((data.value / 1000).toFixed(2)) this.currentTime = Number((data.value / 1000).toFixed(2))
this.bufferedTime = Number((data.bufferedTime / 1000).toFixed(2))
this.timeupdate() this.timeupdate()
}, 1000) }, 1000)
}, },