Browse Source

bugfix: 设置loop后,有概率导致无法播放问题

hexleo 5 years ago
parent
commit
e6a3eca902

+ 10 - 7
Android/PlayerProj/animplayer/src/main/java/com/tencent/qgame/animplayer/AnimPlayer.kt

@@ -47,6 +47,8 @@ class AnimPlayer(val animView: AnimView) {
     var isDetachedFromWindow = false
     var isSurfaceAvailable = false
     var startRunnable: Runnable? = null
+    var isStartRunning = false // 启动时运行状态
+
     val configManager = AnimConfigManager(this)
     val pluginManager = AnimPluginManager(this)
 
@@ -68,14 +70,11 @@ class AnimPlayer(val animView: AnimView) {
     }
 
     fun startPlay(fileContainer: FileContainer) {
+        isStartRunning = true
         prepareDecoder()
-        if (isRunning()) {
-            ALog.i(TAG, "is running can not start")
-            return
-        }
-
         if (decoder?.prepareThread() == false) {
             decoder?.onFailed(Constant.REPORT_ERROR_TYPE_CREATE_THREAD, Constant.ERROR_MSG_CREATE_THREAD)
+            isStartRunning = false
             return
         }
         // 在线程中解析配置
@@ -83,6 +82,7 @@ class AnimPlayer(val animView: AnimView) {
             val result = configManager.parseConfig(fileContainer, videoMode, fps)
             if (result != Constant.OK) {
                 decoder?.onFailed(result, Constant.getErrorMsg(result))
+                isStartRunning = false
                 return@post
             }
             ALog.i(TAG, "parse ${configManager.config}")
@@ -99,10 +99,11 @@ class AnimPlayer(val animView: AnimView) {
     private fun innerStartPlay(fileContainer: FileContainer) {
         synchronized(AnimPlayer::class.java) {
             if (isSurfaceAvailable) {
+                isStartRunning = false
                 decoder?.start(fileContainer)
                 audioPlayer?.start(fileContainer)
             } else {
-                 startRunnable = Runnable {
+                startRunnable = Runnable {
                     innerStartPlay(fileContainer)
                 }
                 animView.prepareTextureView()
@@ -116,7 +117,9 @@ class AnimPlayer(val animView: AnimView) {
     }
 
     fun isRunning(): Boolean {
-        return (decoder?.isRunning ?: false) || configManager.isParsingConfig
+        return isStartRunning // 启动过程运行状态
+                || (decoder?.isRunning ?: false) // 解码过程运行状态
+
     }
 
     private fun prepareDecoder() {

+ 1 - 1
Android/PlayerProj/animplayer/src/main/java/com/tencent/qgame/animplayer/AnimView.kt

@@ -223,8 +223,8 @@ open class AnimView @JvmOverloads constructor(context: Context, attrs: Attribute
                 ALog.e(TAG, "AnimView is GONE, can't play")
                 return@ui
             }
-            lastFile = fileContainer
             if (player?.isRunning() == false) {
+                lastFile = fileContainer
                 player?.startPlay(fileContainer)
             } else {
                 ALog.i(TAG, "is running can not start")

+ 1 - 0
Android/PlayerProj/animplayer/src/main/java/com/tencent/qgame/animplayer/HardDecoder.kt

@@ -183,6 +183,7 @@ class HardDecoder(player: AnimPlayer) : Decoder(player), SurfaceTexture.OnFrameA
                         var loop = 0
                         if (bufferInfo.flags and MediaCodec.BUFFER_FLAG_END_OF_STREAM != 0) {
                             loop = --playLoop
+                            player.playLoop = playLoop // 消耗loop次数 自动恢复后能有正确的loop次数
                             outputDone = playLoop <= 0
                         }
                         val doRender = !outputDone