首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用MediaCodec和MTK编解码器编码时选择H264配置文件

使用MediaCodec和MTK编解码器编码时选择H264配置文件
EN

Stack Overflow用户
提问于 2014-10-08 20:57:19
回答 3查看 7.9K关注 0票数 6

我们有一个安卓应用程序,可以将视频编码成H264。在所有之前尝试过的Android设备上,这是我需要的基线配置文件编码。

联想Yoga10的编解码器是OMX.MTK.VIDEO.ENCODER.AVC,它将视频编码为High Profile,这给接收设备带来了问题。

我正在使用MediaCodec。似乎无法设置要使用的配置文件。

有什么方法可以做到这一点吗?编解码器确实声称支持基线配置文件,但没有提供使用它的方法。是否有针对此的编解码器特定参数?

EN

回答 3

Stack Overflow用户

发布于 2014-10-10 14:44:49

您可以尝试将密钥profile添加到MediaFormat中,其值为1 (OMX_VIDEO_AVCProfileBaseline)。如果这样做,您可能还需要添加具有与您的分辨率匹配的等级值的键level (具有来自OMX AVC级别常量的值)。

我不确定这个编解码器是否真的支持请求的值,但它可能值得一试。

有关设置过程的示例,请参阅https://android.googlesource.com/platform/frameworks/av/+/6ade04174/media/libstagefright/ACodec.cpp中的setupAVCEncoderParameters函数。它在输入参数(从您提供的MediaFormat复制而来)中查找profile键,但是如果存在这个键,您还需要提供一个level参数,并且使用什么级别取决于您的分辨率。有关可用于参数的常量值,请参见https://android.googlesource.com/platform/frameworks/native/+/cde4b13a/include/media/openmax/OMX_Video.h

但是在检查profile和level参数之后,它似乎也覆盖了profile to baseline,而不管设置了什么。因此,这些行可能已从您的设备中删除,或者编码器完全忽略了h264type.eProfile字段。

如果有人有一个更接近设备实际使用情况的源码树,那么检查一下会更好。

作为如何为您的解析选择合适级别的示例,可以查看http://git.videolan.org/?p=x264.git;a=blob;f=encoder/set.c;h=1a40b71284中的x264_validate_levels (但是传递给MediaFormat的级别需要使用OMX_VIDEO_AVCLEVELTYPE常量来表示)。

我不确定这是否有帮助,但至少值得一试。

票数 3
EN

Stack Overflow用户

发布于 2016-08-17 22:26:20

以下是我在我的应用程序中所做的一段代码:

代码语言:javascript
复制
mediaFormat.setInteger("profile", 8); // Profile HIGH
mediaFormat.setInteger("level", 0x200); // Level 3.1

下面是您可以选择的配置文件值:

代码语言:javascript
复制
OMX_VIDEO_AVCProfileBaseline = 0x01,   /**< Baseline profile */
OMX_VIDEO_AVCProfileMain     = 0x02,   /**< Main profile */
OMX_VIDEO_AVCProfileExtended = 0x04,   /**< Extended profile */
OMX_VIDEO_AVCProfileHigh     = 0x08,   /**< High profile */
OMX_VIDEO_AVCProfileHigh10   = 0x10,   /**< High 10 profile */
OMX_VIDEO_AVCProfileHigh422  = 0x20,   /**< High 4:2:2 profile */
OMX_VIDEO_AVCProfileHigh444  = 0x40,   /**< High 4:4:4 profile */
OMX_VIDEO_AVCProfileKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
OMX_VIDEO_AVCProfileVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
OMX_VIDEO_AVCProfileMax      = 0x7FFFFFFF  

和级别:

代码语言:javascript
复制
OMX_VIDEO_AVCLevel1   = 0x01,     /**< Level 1 */
OMX_VIDEO_AVCLevel1b  = 0x02,     /**< Level 1b */
OMX_VIDEO_AVCLevel11  = 0x04,     /**< Level 1.1 */
OMX_VIDEO_AVCLevel12  = 0x08,     /**< Level 1.2 */
OMX_VIDEO_AVCLevel13  = 0x10,     /**< Level 1.3 */
OMX_VIDEO_AVCLevel2   = 0x20,     /**< Level 2 */
OMX_VIDEO_AVCLevel21  = 0x40,     /**< Level 2.1 */
OMX_VIDEO_AVCLevel22  = 0x80,     /**< Level 2.2 */
OMX_VIDEO_AVCLevel3   = 0x100,    /**< Level 3 */
OMX_VIDEO_AVCLevel31  = 0x200,    /**< Level 3.1 */
OMX_VIDEO_AVCLevel32  = 0x400,    /**< Level 3.2 */
OMX_VIDEO_AVCLevel4   = 0x800,    /**< Level 4 */
OMX_VIDEO_AVCLevel41  = 0x1000,   /**< Level 4.1 */
OMX_VIDEO_AVCLevel42  = 0x2000,   /**< Level 4.2 */
OMX_VIDEO_AVCLevel5   = 0x4000,   /**< Level 5 */
OMX_VIDEO_AVCLevel51  = 0x8000,   /**< Level 5.1 */
OMX_VIDEO_AVCLevelKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
OMX_VIDEO_AVCLevelVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
OMX_VIDEO_AVCLevelMax = 0x7FFFFFFF  

两者都设置是很重要的。

票数 1
EN

Stack Overflow用户

发布于 2015-01-07 02:03:48

我已经在Nvidia硬件编码器的Nexus 9上尝试过了。对我来说唯一有效的方法就是按名称选择编码器。我可以将配置文件设置为编码器级别的选定值始终设置为13。

请注意,如果您按类型选择编码器,则会选择google编码器,如上所述,它会强制配置文件为基线。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26257474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档