瀏覽代碼

添加pause、resume接口

jeofferyli 4 年之前
父節點
當前提交
09ede47dfb

+ 9 - 0
Android/PlayerProj/animplayer/src/main/java/com/tencent/qgame/animplayer/AnimPlayer.kt

@@ -122,6 +122,15 @@ class AnimPlayer(val animView: IAnimView) {
         }
     }
 
+    fun pause() {
+        decoder?.pause()
+        audioPlayer?.stop()
+    }
+
+    fun resume() {
+        decoder?.resume()
+    }
+
     fun stopPlay() {
         decoder?.stop()
         audioPlayer?.stop()

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

@@ -286,6 +286,13 @@ open class AnimView @JvmOverloads constructor(context: Context, attrs: Attribute
         }
     }
 
+    override fun pausePlay() {
+        player.pause()
+    }
+
+    override fun resumePlay() {
+        player.resume()
+    }
 
     override fun stopPlay() {
         player.stopPlay()

+ 13 - 0
Android/PlayerProj/animplayer/src/main/java/com/tencent/qgame/animplayer/Decoder.kt

@@ -69,14 +69,27 @@ abstract class Decoder(val player: AnimPlayer) : IAnimListener {
     var playLoop = 0 // 循环播放次数
     var isRunning = false // 是否正在运行
     var isStopReq = false // 是否需要停止
+    var isPauseReq = false // 是否需要暂停
     val speedControlUtil by lazy { SpeedControlUtil() }
 
     abstract fun start(fileContainer: IFileContainer)
 
+    abstract fun start()
+
     fun stop() {
         isStopReq = true
     }
 
+    fun pause() {
+        isPauseReq = true
+    }
+
+    fun resume() {
+        if (isPauseReq) {
+            isPauseReq = false
+            start()
+        }
+    }
     abstract fun destroy()
 
     fun prepareThread(): Boolean {

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

@@ -49,6 +49,15 @@ class HardDecoder(player: AnimPlayer) : Decoder(player), SurfaceTexture.OnFrameA
     private var needYUV = false
     private var outputFormat: MediaFormat? = null
 
+    private val lock = java.lang.Object()
+
+    override fun start() {
+        synchronized(lock) {
+            ALog.d(TAG, "lock notifyAll")
+            lock.notifyAll()
+        }
+    }
+
     override fun start(fileContainer: IFileContainer) {
         isStopReq = false
         needDestroy = false
@@ -199,6 +208,16 @@ class HardDecoder(player: AnimPlayer) : Decoder(player), SurfaceTexture.OnFrameA
                 return
             }
 
+            if (isPauseReq) {
+                ALog.i(TAG, "pause decode")
+                synchronized(lock) {
+                    lock.wait()
+                }
+
+                speedControlUtil.reset()
+                ALog.i(TAG, "resume decode")
+            }
+
             if (!inputDone) {
                 val inputBufIndex = decoder.dequeueInputBuffer(TIMEOUT_USEC)
                 if (inputBufIndex >= 0) {

+ 4 - 0
Android/PlayerProj/animplayer/src/main/java/com/tencent/qgame/animplayer/IAnimView.kt

@@ -58,6 +58,10 @@ interface IAnimView {
 
     fun startPlay(fileContainer: IFileContainer)
 
+    fun pausePlay()
+
+    fun resumePlay()
+
     fun stopPlay()
 
     fun isRunning(): Boolean

+ 13 - 1
Android/PlayerProj/app/src/main/java/com/tencent/qgame/playerproj/player/AnimSimpleDemoActivity.kt

@@ -158,7 +158,7 @@ class AnimSimpleDemoActivity : Activity(), IAnimListener {
 
 
     private fun initLog() {
-        ALog.isDebug = false
+        ALog.isDebug = true
         ALog.log = object : IALog {
             override fun i(tag: String, msg: String) {
                 Log.i(tag, msg)
@@ -193,6 +193,18 @@ class AnimSimpleDemoActivity : Activity(), IAnimListener {
         btnStop.setOnClickListener {
             animView.stopPlay()
         }
+        /**
+         * 暂停播放按钮
+         */
+        btnPause.setOnClickListener {
+            animView.pausePlay()
+        }
+        /**
+         * 恢复视频按钮
+         */
+        btnResume.setOnClickListener {
+            animView.resumePlay()
+        }
     }
 
     private fun loadFile() {

+ 19 - 0
Android/PlayerProj/app/src/main/res/layout/activity_anim_simple_demo.xml

@@ -15,16 +15,35 @@
         android:orientation="horizontal"
         android:visibility="gone">
         <Button
+            android:padding="20dp"
+            android:layout_margin="10dp"
             android:id="@+id/btnPlay"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="PLAY"/>
         <Button
+            android:padding="20dp"
+            android:layout_margin="10dp"
             android:id="@+id/btnStop"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="STOP"/>
 
+        <Button
+            android:padding="20dp"
+            android:layout_margin="10dp"
+            android:id="@+id/btnPause"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="PAUSE"/>
+        <Button
+            android:padding="20dp"
+            android:layout_margin="10dp"
+            android:id="@+id/btnResume"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="RESUME"/>
+
     </LinearLayout>