Browse Source

feat: h265判断

hexleo 5 years ago
parent
commit
d81b151f22

+ 2 - 0
Android/PlayerProj/animplayer/src/main/java/com/tencent/qgame/animplayer/Constant.kt

@@ -39,6 +39,7 @@ object Constant {
     const val REPORT_ERROR_TYPE_PARSE_CONFIG = 10005 // 配置解析失败
     const val REPORT_ERROR_TYPE_CONFIG_PLUGIN_MIX = 10006 // vapx融合动画资源获取失败
     const val REPORT_ERROR_TYPE_FILE_ERROR = 10007 // 文件无法读取
+    const val REPORT_ERROR_TYPE_HEVC_NOT_SUPPORT = 10008 // 不支持h265
 
     const val ERROR_MSG_EXTRACTOR_EXC = "0x1 MediaExtractor exception" // MediaExtractor exception
     const val ERROR_MSG_DECODE_EXC = "0x2 MediaCodec exception" // MediaCodec exception
@@ -47,6 +48,7 @@ object Constant {
     const val ERROR_MSG_PARSE_CONFIG = "0x5 parse config fail" // 配置解析失败
     const val ERROR_MSG_CONFIG_PLUGIN_MIX = "0x6 vapx fail" // vapx融合动画资源获取失败
     const val ERROR_MSG_FILE_ERROR = "0x7 file can't read" // 文件无法读取
+    const val ERROR_MSG_HEVC_NOT_SUPPORT = "0x8 hevc not support" // 不支持h265
 
 
     fun getErrorMsg(errorType: Int, errorMsg: String? = null): String {

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

@@ -22,7 +22,7 @@ import java.io.File
 import java.io.FileNotFoundException
 import java.io.RandomAccessFile
 
-class FileContainer {
+open class FileContainer {
 
     private var isAssets = false
 

+ 18 - 2
Android/PlayerProj/animplayer/src/main/java/com/tencent/qgame/animplayer/HardDecoder.kt

@@ -19,6 +19,7 @@ import android.graphics.SurfaceTexture
 import android.media.MediaCodec
 import android.media.MediaExtractor
 import android.media.MediaFormat
+import android.os.Build
 import android.view.Surface
 import com.tencent.qgame.animplayer.util.ALog
 import com.tencent.qgame.animplayer.util.MediaUtil
@@ -87,6 +88,17 @@ class HardDecoder(player: AnimPlayer) : Decoder(player), SurfaceTexture.OnFrameA
             extractor.selectTrack(trackIndex)
             format = extractor.getTrackFormat(trackIndex)
             if (format == null) throw RuntimeException("format is null")
+
+            // 是否支持h265
+            if (MediaUtil.checkIsHevc(format)) {
+                if (Build.VERSION.SDK_INT  < Build.VERSION_CODES.LOLLIPOP ) {
+                    onFailed(Constant.REPORT_ERROR_TYPE_HEVC_NOT_SUPPORT,
+                        "${Constant.ERROR_MSG_HEVC_NOT_SUPPORT} sdk:${Build.VERSION.SDK_INT}")
+                    release(null, null)
+                    return
+                }
+            }
+
             val videoWidth = format.getInteger(MediaFormat.KEY_WIDTH)
             val videoHeight = format.getInteger(MediaFormat.KEY_HEIGHT)
             ALog.i(TAG, "Video size is $videoWidth x $videoHeight")
@@ -138,7 +150,7 @@ class HardDecoder(player: AnimPlayer) : Decoder(player), SurfaceTexture.OnFrameA
         var inputChunk = 0
         var outputDone = false
         var inputDone = false
-        var frameIndex = 1
+        var frameIndex = 0
 
         val decoderInputBuffers = decoder.inputBuffers
 
@@ -190,12 +202,16 @@ class HardDecoder(player: AnimPlayer) : Decoder(player), SurfaceTexture.OnFrameA
                         if (doRender) {
                             speedControlUtil.preRender(bufferInfo.presentationTimeUs)
                         }
+
+                        // release & render
                         decoder.releaseOutputBuffer(decoderStatus, doRender)
-                        if (frameIndex == 1) {
+
+                        if (frameIndex == 0) {
                             onVideoStart()
                         }
                         player.pluginManager.onDecoding(frameIndex)
                         onVideoRender(frameIndex, player.configManager.config)
+
                         frameIndex++
                         ALog.d(TAG, "decode frameIndex=$frameIndex")
                         if (loop > 0) {

+ 2 - 2
Android/PlayerProj/animplayer/src/main/java/com/tencent/qgame/animplayer/plugin/AnimPluginManager.kt

@@ -80,7 +80,6 @@ class AnimPluginManager(val player: AnimPlayer) {
     }
 
     fun onRendering() {
-        frameIndex++
         if (decodeIndex > frameIndex + 1 || frameDiffTimes >= DIFF_TIMES) {
             ALog.i(TAG, "jump frameIndex= $frameIndex,decodeIndex=$decodeIndex,frameDiffTimes=$frameDiffTimes")
             frameIndex = decodeIndex
@@ -92,8 +91,9 @@ class AnimPluginManager(val player: AnimPlayer) {
         }
         ALog.d(TAG, "onRendering frameIndex=$frameIndex")
         plugins.forEach {
-            it.onRendering(frameIndex - 1) // 第一帧算0
+            it.onRendering(frameIndex) // 第一帧 0
         }
+        frameIndex++
     }
 
     fun onRelease() {

+ 10 - 2
Android/PlayerProj/animplayer/src/main/java/com/tencent/qgame/animplayer/util/MediaUtil.kt

@@ -30,13 +30,21 @@ object MediaUtil {
         return extractor
     }
 
+    /**
+     * 是否为h265的视频
+     */
+    fun checkIsHevc(videoFormat: MediaFormat):Boolean {
+        val mime = videoFormat.getString(MediaFormat.KEY_MIME) ?: ""
+        return mime.contains("hevc")
+    }
+
     fun selectVideoTrack(extractor: MediaExtractor): Int {
         val numTracks = extractor.trackCount
         for (i in 0 until numTracks) {
             val format = extractor.getTrackFormat(i)
             val mime = format.getString(MediaFormat.KEY_MIME) ?: ""
             if (mime.startsWith("video/")) {
-                ALog.d(TAG, "Extractor selected track $i ($mime): $format")
+                ALog.i(TAG, "Extractor selected track $i ($mime): $format")
                 return i
             }
         }
@@ -49,7 +57,7 @@ object MediaUtil {
             val format = extractor.getTrackFormat(i)
             val mime = format.getString(MediaFormat.KEY_MIME) ?: ""
             if (mime.startsWith("audio/")) {
-                ALog.d(TAG, "Extractor selected track $i ($mime): $format")
+                ALog.i(TAG, "Extractor selected track $i ($mime): $format")
                 return i
             }
         }