MediaCodec判断是否可以采用硬解码

import android.media.MediaCodecList;

import java.util.HashMap;
import java.util.Map;

public class VideoSupportUitl {

    private static Map<String, String> codecMap = new HashMap<>();
    static {
        codecMap.put("h264", "video/avc");
    }

    public static String findVideoCodecName(String ffcodename){
        if(codecMap.containsKey(ffcodename))
        {
            return codecMap.get(ffcodename);
        }
        return "";
    }

    public static boolean isSupportCodec(String ffcodecname){
        boolean supportvideo = false;
        int count = MediaCodecList.getCodecCount();
        for(int i = 0; i < count; i++)
        {
            String[] tyeps = MediaCodecList.getCodecInfoAt(i).getSupportedTypes();
            for(int j = 0; j < tyeps.length; j++)
            {
                if(tyeps[j].equals(findVideoCodecName(ffcodecname)))
                {
                    supportvideo = true;
                    break;
                }
            }
            if(supportvideo)
            {
                break;
            }
        }
        return supportvideo;
    }
}

具体的类型对应关系可以查看相关文档,这里在Android源码MediaCodec.createDecoderByType()里面有一些相关的对应支持类型。

/**
    * Instantiate the preferred decoder supporting input data of the given mime type.
    *
    * The following is a partial list of defined mime types and their semantics:
    * <ul>
    * <li>"video/x-vnd.on2.vp8" - VP8 video (i.e. video in .webm)
    * <li>"video/x-vnd.on2.vp9" - VP9 video (i.e. video in .webm)
    * <li>"video/avc" - H.264/AVC video
    * <li>"video/hevc" - H.265/HEVC video
    * <li>"video/mp4v-es" - MPEG4 video
    * <li>"video/3gpp" - H.263 video
    * <li>"audio/3gpp" - AMR narrowband audio
    * <li>"audio/amr-wb" - AMR wideband audio
    * <li>"audio/mpeg" - MPEG1/2 audio layer III
    * <li>"audio/mp4a-latm" - AAC audio (note, this is raw AAC packets, not packaged in LATM!)
    * <li>"audio/vorbis" - vorbis audio
    * <li>"audio/g711-alaw" - G.711 alaw audio
    * <li>"audio/g711-mlaw" - G.711 ulaw audio
    * </ul>
    *
    * <strong>Note:</strong> It is preferred to use {@link MediaCodecList#findDecoderForFormat}
    * and {@link #createByCodecName} to ensure that the resulting codec can handle a
    * given format.
    *
    * @param type The mime type of the input data.
    * @throws IOException if the codec cannot be created.
    * @throws IllegalArgumentException if type is not a valid mime type.
    * @throws NullPointerException if type is null.
    */
   @NonNull
   public static MediaCodec createDecoderByType(@NonNull String type)
           throws IOException {
       return new MediaCodec(type, true /* nameIsType */, false /* encoder */);
   }

ffmpeg里面

((const AVCodec*)(avCodecContext->codec))->name;

即可拿到name,然后jni交互调用即可。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java爬坑系列

【Java入门提高篇】Day32 Java容器类详解(十四)ArrayDeque详解

  今天来介绍一个不太常见也不太常用的类——ArrayDeque,这是一个很不错的容器类,如果对它还不了解的话,那么就好好看看这篇文章吧。

982
来自专栏C/C++基础

给定入栈序列,判断出栈序列是否合法

题目:分别给定入栈序列和出栈序列,然后判断出栈序列是否合法。如入栈序列是[1,3,2,4,5],出栈序列[3,1,2,4,5]是合法的,[3,1,5,2,4]是...

902
来自专栏葡萄城控件技术团队

深入浅出OOP(四): 多态和继承(抽象类)

在本文中,我们讨论OOP中的热点之一:抽象类。抽象类在各个编程语言中概念是一致的,但是C#稍微有些不一样。本文中我们会通过代码来实现抽象类,并一一进行解析。 A...

1976
来自专栏刘君君

JDK8的LinkedList源码学习笔记

2284
来自专栏Java学习网

Java中如何判断一个字符串是Java代码还是英文呢?

先给出以下两个字符串: 1、for (int i = 0; i< b.size(); i++) { 2、do something in English 从人工角...

2799
来自专栏猿人谷

出栈顺序

之前参加过华北计算机研究所和优酷土豆的笔试,都考到出栈顺序,之前数据结构学的不到位,遇到这类题时,还着实把我愣了一会,现在总结下,省得以后再遇到这类问题,也希...

3446
来自专栏码匠的流水账

java计算集合对称差

两个集合的对称差是只属于其中一个集合,而不属于另一个集合的元素组成的集合。 集合A和B的对称差通常表示为AΔB,对称差的符号在有些图论书籍中也使用符号⊕来表示。...

1053
来自专栏Java编程技术

JDK动态代理代理与Cglib代理原理探究

UserServiceImpl被JDK代理后的类,在项目的com.sun.proxy下面生成$Proxy0.class类

2572
来自专栏云霄雨霁

数据结构----背包

1980
来自专栏你不就像风一样

Java多线程核心技术(五)单例模式与多线程

什么是立即加载?立即加载就是使用类的时候已经将对象创建完毕,常见的实现办法就是直接 new 实例化。

703

扫码关注云+社区

领取腾讯云代金券