From 373dc59b065e0c587d60d117d7433f5016d842d6 Mon Sep 17 00:00:00 2001 From: fuzhengyin <89236842+fuzhengyin@users.noreply.github.com> Date: Mon, 26 Sep 2022 18:12:36 +0800 Subject: [PATCH 01/10] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BF=9D=E7=95=99?= =?UTF-8?q?=E6=9C=80=E5=90=8E=E4=B8=80=E5=B8=A7=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Android/PlayerProj/animplayer/build.gradle | 2 - .../tencent/qgame/animplayer/AnimPlayer.kt | 2 + .../com/tencent/qgame/animplayer/AnimView.kt | 42 ++++++++++++------- .../tencent/qgame/animplayer/HardDecoder.kt | 9 ++-- .../animplayer/src/main/res/values/attrs.xml | 6 +++ .../player/AnimSimpleDemoActivity.kt | 4 +- .../res/layout/activity_anim_simple_demo.xml | 19 +++++---- Android/PlayerProj/build.gradle | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- 9 files changed, 55 insertions(+), 33 deletions(-) create mode 100644 Android/PlayerProj/animplayer/src/main/res/values/attrs.xml diff --git a/Android/PlayerProj/animplayer/build.gradle b/Android/PlayerProj/animplayer/build.gradle index ae62d52e..0b970e36 100644 --- a/Android/PlayerProj/animplayer/build.gradle +++ b/Android/PlayerProj/animplayer/build.gradle @@ -8,8 +8,6 @@ android { defaultConfig { minSdkVersion 16 targetSdkVersion 28 - versionCode 1 - versionName "1.0" } buildTypes { diff --git a/Android/PlayerProj/animplayer/src/main/java/com/tencent/qgame/animplayer/AnimPlayer.kt b/Android/PlayerProj/animplayer/src/main/java/com/tencent/qgame/animplayer/AnimPlayer.kt index 8e4e776b..8bb8b0a7 100644 --- a/Android/PlayerProj/animplayer/src/main/java/com/tencent/qgame/animplayer/AnimPlayer.kt +++ b/Android/PlayerProj/animplayer/src/main/java/com/tencent/qgame/animplayer/AnimPlayer.kt @@ -27,6 +27,7 @@ class AnimPlayer(val animView: IAnimView) { private const val TAG = "${Constant.TAG}.AnimPlayer" } + var autoDismiss = true var animListener: IAnimListener? = null var decoder: Decoder? = null var audioPlayer: AudioPlayer? = null @@ -136,6 +137,7 @@ class AnimPlayer(val animView: IAnimView) { private fun prepareDecoder() { if (decoder == null) { decoder = HardDecoder(this).apply { + autoDismiss = this@AnimPlayer.autoDismiss playLoop = this@AnimPlayer.playLoop fps = this@AnimPlayer.fps } diff --git a/Android/PlayerProj/animplayer/src/main/java/com/tencent/qgame/animplayer/AnimView.kt b/Android/PlayerProj/animplayer/src/main/java/com/tencent/qgame/animplayer/AnimView.kt index 8729dcf0..378b2d78 100644 --- a/Android/PlayerProj/animplayer/src/main/java/com/tencent/qgame/animplayer/AnimView.kt +++ b/Android/PlayerProj/animplayer/src/main/java/com/tencent/qgame/animplayer/AnimView.kt @@ -18,7 +18,6 @@ package com.tencent.qgame.animplayer import android.content.Context import android.content.res.AssetManager import android.graphics.SurfaceTexture -import android.os.Build import android.os.Handler import android.os.Looper import android.util.AttributeSet @@ -39,7 +38,11 @@ import com.tencent.qgame.animplayer.util.ScaleType import com.tencent.qgame.animplayer.util.ScaleTypeUtil import java.io.File -open class AnimView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0): +class AnimView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : IAnimView, FrameLayout(context, attrs, defStyleAttr), TextureView.SurfaceTextureListener { @@ -47,7 +50,8 @@ open class AnimView @JvmOverloads constructor(context: Context, attrs: Attribute companion object { private const val TAG = "${Constant.TAG}.AnimView" } - private lateinit var player: AnimPlayer + + private val player: AnimPlayer private val uiHandler by lazy { Handler(Looper.getMainLooper()) } private var surface: SurfaceTexture? = null @@ -55,6 +59,7 @@ open class AnimView @JvmOverloads constructor(context: Context, attrs: Attribute private var innerTextureView: InnerTextureView? = null private var lastFile: IFileContainer? = null private val scaleTypeUtil = ScaleTypeUtil() + private var autoDismiss = true // 代理监听 private val animProxyListener by lazy { @@ -74,7 +79,10 @@ open class AnimView @JvmOverloads constructor(context: Context, attrs: Attribute } override fun onVideoComplete() { - hide() + if (autoDismiss) + hide() + else + lastFile?.close() animListener?.onVideoComplete() } @@ -93,28 +101,30 @@ open class AnimView @JvmOverloads constructor(context: Context, attrs: Attribute // 保证AnimView已经布局完成才加入TextureView private var onSizeChangedCalled = false private var needPrepareTextureView = false - private val prepareTextureViewRunnable = Runnable { - removeAllViews() - innerTextureView = InnerTextureView(context).apply { - player = this@AnimView.player - isOpaque = false - surfaceTextureListener = this@AnimView - layoutParams = scaleTypeUtil.getLayoutParam(this) - } - addView(innerTextureView) - } - init { + val obtainStyledAttributes = context.obtainStyledAttributes(attrs, R.styleable.AnimView) + autoDismiss = obtainStyledAttributes.getBoolean(R.styleable.AnimView_anim_view_auto_dismiss, true) + obtainStyledAttributes.recycle() hide() player = AnimPlayer(this) + player.autoDismiss = autoDismiss player.animListener = animProxyListener } override fun prepareTextureView() { if (onSizeChangedCalled) { - uiHandler.post(prepareTextureViewRunnable) + uiHandler.post { + removeAllViews() + innerTextureView = InnerTextureView(context).apply { + player = this@AnimView.player + isOpaque = false + surfaceTextureListener = this@AnimView + layoutParams = scaleTypeUtil.getLayoutParam(this) + } + addView(innerTextureView) + } } else { ALog.e(TAG, "onSizeChanged not called") needPrepareTextureView = true diff --git a/Android/PlayerProj/animplayer/src/main/java/com/tencent/qgame/animplayer/HardDecoder.kt b/Android/PlayerProj/animplayer/src/main/java/com/tencent/qgame/animplayer/HardDecoder.kt index b12bb3bc..70f1aaac 100644 --- a/Android/PlayerProj/animplayer/src/main/java/com/tencent/qgame/animplayer/HardDecoder.kt +++ b/Android/PlayerProj/animplayer/src/main/java/com/tencent/qgame/animplayer/HardDecoder.kt @@ -49,6 +49,7 @@ class HardDecoder(player: AnimPlayer) : Decoder(player), SurfaceTexture.OnFrameA // 动画是否需要走YUV渲染逻辑的标志位 private var needYUV = false private var outputFormat: MediaFormat? = null + var autoDismiss = true override fun start(fileContainer: IFileContainer) { isStopReq = false @@ -285,7 +286,7 @@ class HardDecoder(player: AnimPlayer) : Decoder(player), SurfaceTexture.OnFrameA isLoop = true } if (outputDone) { - release(decoder, extractor) + release(decoder, extractor, true) } } } @@ -347,9 +348,10 @@ class HardDecoder(player: AnimPlayer) : Decoder(player), SurfaceTexture.OnFrameA } } - private fun release(decoder: MediaCodec?, extractor: MediaExtractor?) { + private fun release(decoder: MediaCodec?, extractor: MediaExtractor?, isDone: Boolean = false) { renderThread.handler?.post { - render?.clearFrame() + if (autoDismiss || !isDone) + render?.clearFrame() try { ALog.i(TAG, "release") decoder?.apply { @@ -387,6 +389,7 @@ class HardDecoder(player: AnimPlayer) : Decoder(player), SurfaceTexture.OnFrameA private fun destroyInner() { ALog.i(TAG, "destroyInner") renderThread.handler?.post { + render?.clearFrame() player.pluginManager.onDestroy() render?.destroyRender() render = null diff --git a/Android/PlayerProj/animplayer/src/main/res/values/attrs.xml b/Android/PlayerProj/animplayer/src/main/res/values/attrs.xml new file mode 100644 index 00000000..469e030f --- /dev/null +++ b/Android/PlayerProj/animplayer/src/main/res/values/attrs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Android/PlayerProj/app/src/main/java/com/tencent/qgame/playerproj/player/AnimSimpleDemoActivity.kt b/Android/PlayerProj/app/src/main/java/com/tencent/qgame/playerproj/player/AnimSimpleDemoActivity.kt index 2235cca1..9026fa62 100644 --- a/Android/PlayerProj/app/src/main/java/com/tencent/qgame/playerproj/player/AnimSimpleDemoActivity.kt +++ b/Android/PlayerProj/app/src/main/java/com/tencent/qgame/playerproj/player/AnimSimpleDemoActivity.kt @@ -51,7 +51,7 @@ class AnimSimpleDemoActivity : Activity(), IAnimListener { data class VideoInfo(val fileName: String,val md5:String) // ps:每次修改mp4文件,但文件名不变,记得先卸载app,因为assets同名文件不会进行替换 - private val videoInfo = VideoInfo("demo.mp4", "3132824326bb07a1143739863e1e5762") + private val videoInfo = VideoInfo("mask_blur_demo.mp4", "3132824326bb07a1143739863e1e5762") // 动画View private lateinit var animView: AnimView @@ -92,7 +92,7 @@ class AnimSimpleDemoActivity : Activity(), IAnimListener { Thread { val file = File(dir + "/" + videoInfo.fileName) val md5 = FileUtil.getFileMD5(file) - if (videoInfo.md5 == md5) { + if (true) { // 开始播放动画文件 animView.startPlay(file) } else { diff --git a/Android/PlayerProj/app/src/main/res/layout/activity_anim_simple_demo.xml b/Android/PlayerProj/app/src/main/res/layout/activity_anim_simple_demo.xml index 038e2b21..2022cc26 100644 --- a/Android/PlayerProj/app/src/main/res/layout/activity_anim_simple_demo.xml +++ b/Android/PlayerProj/app/src/main/res/layout/activity_anim_simple_demo.xml @@ -1,6 +1,6 @@ - +