Android MediaCodec 设置 MediaFormat.KEY_PROFILE 问题

我在设置 MediaCodec profile 的时候,一直没有成功,看了源码之后才发现问题之所在:

https://android.googlesource.com/platform/frameworks/av/+/437ced8a14944bf5450df50c5e7e7a6dfe20ea40/media/libstagefright/ACodec.cpp

设置了 profile 之后,你还要设置一个 Level 属性,但是目前最新的 SDK 里面并没有提供这个 Key。

即使你手动的设置 level ,比如像这样:

MediaCodec codec = createEncoderByType(MediaFormat.MIMETYPE_VIDEO_AVC);
MediaFormat format = = MediaFormat.createVideoFormat(MediaFormat.MIMETYPE_VIDEO_AVC, 1920, 1080);
format.setInteger(MediaFormat.KEY_PROFILE, MediaCodecInfo.CodecProfileLevel.AVCProfileHigh);
format.setInteger("level", Level_xxx);

codec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);

还是不行的,因为 Android 强制将 profile 设置为 Baseline 了。

// XXX
    if (h264type.eProfile != OMX_VIDEO_AVCProfileBaseline) {
        ALOGW("Use baseline profile instead of %d for AVC recording",
            h264type.eProfile);
        h264type.eProfile = OMX_VIDEO_AVCProfileBaseline;
    }

总之,Android 在使用 MediaCodc 进行 encode 的时候,只能使用 Baseline 的 profile。

Google 之后,发现也有其他的朋友发现了类似的问题,

https://code.google.com/p/android/issues/detail?id=163580

看来这个问题确实存在,不过不清楚为什么 Android 要强制使用 Baseline 的 profile。

时间: 2024-10-29 17:54:30

Android MediaCodec 设置 MediaFormat.KEY_PROFILE 问题的相关文章

Android模拟器设置网络代理方法

在服务器上启动模拟器的时候加了--http-proxy,但是不起作用.所以搜了下面的方法 四种方法: 一:将网络连接代理设置写入配置数据库 (适合启动模拟器无界面) 1.通过命令行或者通过双击emulatoer可执行文件,打开模拟器 2.在命令行执行adb shell 打开android的控制台 (确保环境变量设置正确,即已经把Android_SDK/tools 添加到了PATH(Linux)/path(Windows)) 3.执行 ls -l /data/data/com.android.pr

Android闹钟设置的解决方案

Android设置闹钟并不像IOS那样这么简单,做过Android设置闹钟的开发者都知道里面的坑有多深.下面记录一下,我解决Android闹钟设置的解决方案. 主要问题 API19开始AlarmManager的机制修改. 应用程序被Kill掉后,设置的闹钟不响. 6.0以上进入Doze模式会使JobScheduler停止工作. 手机设置重启后,闹钟失效问题. API19以上AlarmManager机制的修改 API19之前AlarmManager提供了三个设置闹钟的方法,由于业务需求闹钟只需要一

【转】Android中设置TextView的颜色setTextColor

原文网址:http://www.cnblogs.com/myphoebe/archive/2012/01/06/2314728.html android中设置TextView的颜色有方法setTextColor,这个方法被重载了,可以传入两种参数. public void setTextColor(int color) { mTextColor = ColorStateList.valueOf(color); updateTextColors(); } public void setTextCo

android手机设置虚拟网络的步骤

上个周五参加麦子学院班会的时候,android开发老师葛老师讲到android手机设置虚拟网络的问题,她说在android手机使用中,经常会需要设置虚拟网络,下面我就给大家回顾一下麦子学院android开发老师讲的虚拟网络的设置,来看看具体设置步骤: 第一步,打开手机主菜单,选择"设置",然后选择"无线和网络" 第二步:选择"虚拟专用网设置" 第三步:选择"添加虚拟专用网" 第四步:选择"添加L2TP/IPSec P

android WIFI 设置代理代码 4.4.3——5.0

记录下android中设置代理代码 或许有朋友能用的上 适用于4.4.3 在5.0上android.net.ProxyProperties 找不到 估计API被谷歌拿掉了 4.4.4还没试估计API还在 private static String NOTPROXY = ""; //不走代理名单 private static List<String> list; //type为1设置wifi设置 为0是清除代理 public static void setWifi(Conte

Android如何设置TextView的行间距、行高。

     Android系统中TextView默认行间距比较窄,不美观.     我们可以设置每行的行间距,可以通过属性android:lineSpacingExtra或android:lineSpacingMultiplier来做. 在你要设置的TextView中加入如下代码: 1.android:lineSpacingExtra 设置行间距,如"8dp". 2.android:lineSpacingMultiplier 设置行间距的倍数,如"1.5″.       示例:

Android 批量设置监听器,监听器传递参数,重写监听器构造函数

这个问题困扰了我好几天,就在我做的课程表应用中,每个页面有15个TextView,每个都要设置监听器,但是这还不是难事,难的是,用匿名内部类实现监听借口的时候,还要再在里面设置监听器!简而言之,TextView长按变为EditText,EditText点击完成之后把值传回TextView,这一个地方需要两个监听器. 我最早的实现方法是(mon_tv[ ]是一个TextView数组,mon_et[ ]是一个EditText数组): mon_tv[1].setOnLongClickListener(

Android TextView 设置行间距的问题 (setLineSpacing ,lineSpacingExtra, lineSpacingMultiplier)

最近的项目中,需要用到自定义控件.有个组件要获取绘制文本的高度,翻开TextView 的源码,有个方法 getLineHeight() public int getLineHeight() { return FastMath.round(mTextPaint.getFontMetricsInt(null) * mSpacingMult + mSpacingAdd); } getLineHeight 的注释如下: /** * @return the height of one standard l

Android如何设置TextView的行间距、行高

原文来自:你我学习网: 链接地址:http://www.niwoxuexi.com/blog/android/article/222.html Android系统中TextView默认显示中文时会比较紧凑,不是很美观.为了让每行保持一定的行间距, 可以设置属性android:lineSpacingExtra或android:lineSpacingMultiplier. 关于Android下TextView中文换行问题,可查看Android自定义view-文本自动换行. 1.android:lin