美文网首页
第二十一节 MediaCodec解码相关

第二十一节 MediaCodec解码相关

作者: 最美下雨天 | 来源:发表于2018-12-06 14:49 被阅读7次

    检测是否可以被硬解

    image.png
    image.png

    1、在FFMpeg中获取视频解码器的名称

    从AVCodecContext结构体中取得AVCodec,AVCodec也是一个结构体,这个结构体中有个属性name

    2、根据1中获取的name查找手机是否有对应的硬解码器

    一般是在FFMpeg中得到视频解码器的名称(name)后,回调Java层,在Java层检测手机是否有对应的解码器,主要用到类MediaCodecList

    private static Map<String, String> codecMap = new HashMap<>();
        static {
            //https://juejin.im/entry/5aa234f751882555712bf210#comment
            /**
             "video/x-vnd.on2.vp8" - VP8 video (i.e. video in .webm)
             "video/x-vnd.on2.vp9" - VP9 video (i.e. video in .webm)
             "video/avc" - H.264/AVC video
             "video/hevc" - H.265/HEVC video
             "video/mp4v-es" - MPEG4 video
             "video/3gpp" - H.263 video
             "audio/3gpp" - AMR narrowband audio
             "audio/amr-wb" - AMR wideband audio
             "audio/mpeg" - MPEG1/2 audio layer III
             "audio/mp4a-latm" - AAC audio (note, this is raw AAC packets, not packaged in LATM!)
             "audio/vorbis" - vorbis audio
             "audio/g711-alaw" - G.711 alaw audio
             "audio/g711-mlaw" - G.711 ulaw audio
             */
            codecMap.put("h264", "video/avc");
            codecMap.put("h265","hevc");
        }
    
        public static String findVideoCodecName(String ffcodename)
        {
            if(codecMap.containsKey(ffcodename))
            {
                return codecMap.get(ffcodename);
            }
            return "";
        }
    
        @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
        public static boolean isSupportCodec(String ffcodecname)
        {
            boolean supportvideo = false;
            MediaCodecList mediaCodecList =new MediaCodecList(MediaCodecList.ALL_CODECS);
            MediaCodecInfo[] mediaCodecInfos=mediaCodecList.getCodecInfos();
            for(int i = 0; i < mediaCodecInfos.length; i++)
            {
                String[] types = mediaCodecInfos[i].getSupportedTypes();
                for(int j = 0; j < types.length; j++)
                {
                    if(types[j].equals(findVideoCodecName(ffcodecname)))
                    {
                        supportvideo = true;
                        break;
                    }
                }
                if(supportvideo)
                {
                    break;
                }
            }
            return supportvideo;
        }
    

    如果需要对视频进行硬解码,还需要给AVPacket添加解码头信息

    image.png
    image.png
    image.png
    image.png
    经过分析数据发现,原始的AVPacket数据和过滤后的AVPacket数据差别是,过滤后的数据前面会加上0001
    参考:https://blog.csdn.net/leixiaohua1020/article/details/39767055

    相关文章

      网友评论

          本文标题:第二十一节 MediaCodec解码相关

          本文链接:https://www.haomeiwen.com/subject/gcjjfqtx.html