Browse Source

feat: hevc codec type

hexleo 5 years ago
parent
commit
ea6fd4983b

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

@@ -91,9 +91,13 @@ class HardDecoder(player: AnimPlayer) : Decoder(player), SurfaceTexture.OnFrameA
 
             // 是否支持h265
             if (MediaUtil.checkIsHevc(format)) {
-                if (Build.VERSION.SDK_INT  < Build.VERSION_CODES.LOLLIPOP ) {
+                if (Build.VERSION.SDK_INT  < Build.VERSION_CODES.LOLLIPOP
+                    || !MediaUtil.isDeviceSupportHevc) {
+
                     onFailed(Constant.REPORT_ERROR_TYPE_HEVC_NOT_SUPPORT,
-                        "${Constant.ERROR_MSG_HEVC_NOT_SUPPORT} sdk:${Build.VERSION.SDK_INT}")
+                        "${Constant.ERROR_MSG_HEVC_NOT_SUPPORT} " +
+                                "sdk:${Build.VERSION.SDK_INT}" +
+                                ",support hevc:" + MediaUtil.isDeviceSupportHevc)
                     release(null, null)
                     return
                 }

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

@@ -15,15 +15,19 @@
  */
 package com.tencent.qgame.animplayer.util
 
+import android.media.MediaCodecList
 import android.media.MediaExtractor
 import android.media.MediaFormat
 import com.tencent.qgame.animplayer.Constant
 import com.tencent.qgame.animplayer.FileContainer
 
+
 object MediaUtil {
 
     private const val TAG = "${Constant.TAG}.MediaUtil"
 
+    val isDeviceSupportHevc by lazy { checkCodec("video/hevc") }
+
     fun getExtractor(file: FileContainer): MediaExtractor {
         val extractor = MediaExtractor()
         file.setDataSource(extractor)
@@ -63,4 +67,25 @@ object MediaUtil {
         }
         return -1
     }
+
+
+    /**
+     * 检查设备解码支持类型
+     */
+    private fun checkCodec(mimeType: String): Boolean {
+        val numCodecs = MediaCodecList.getCodecCount()
+        for (i in 0 until numCodecs) {
+            val codecInfo = MediaCodecList.getCodecInfoAt(i)
+            if (!codecInfo.isEncoder) {
+                continue
+            }
+            val types = codecInfo.supportedTypes
+            for (j in types.indices) {
+                if (types[j].equals(mimeType, ignoreCase = true)) {
+                    return true
+                }
+            }
+        }
+        return false
+    }
 }