2014-10-08 75 views
5

我们有一个Android应用程序,可将视频编码为H264。在所有以前尝试过的Android设备上,这将编码为基线配置文件,这正是我所需要的。使用MediaCodec和MTK编解码器编码时选择H264配置文件

对联想瑜伽10编解码器是OMX.MTK.VIDEO.ENCODER.AVC。这会将视频编码为High Profile,这会给接收设备带来问题。

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

有没有办法做到这一点?该编解码器声称支持基线配置文件,但无法使用它。有没有一个编解码器的具体参数呢?

回答

3

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

我不知道如果这实际上编解码荣誉的请求的值,虽然,但它可能是值得一试。

参见https://android.googlesource.com/platform/frameworks/av/+/6ade04174/media/libstagefright/ACodec.cppsetupAVCEncoderParameters功能有关的设置过程的例子。它会在输入参数(从您提供的MediaFormat中复制)中寻找profile键,但如果存在此参数,则还需要提供level参数,以及使用的级别取决于您的分辨率。有关可用于参数的常数值,请参阅https://android.googlesource.com/platform/frameworks/native/+/cde4b13a/include/media/openmax/OMX_Video.h

但检查类和级参数后,它似乎也覆盖配置文件,无论什么设置的基线。因此,无论这些行是否已从您的设备中删除,或者编码器完全忽略了h264type.eProfile字段。

如果有人得到了一个源代码树更接近什么是真正的设备上使用,它甚至会更好,用来检查。

至于如何选择适合您的分辨率适当的水平为例,在http://git.videolan.org/?p=x264.git;a=blob;f=encoder/set.c;h=1a40b71284看看x264_validate_levels(但需要使用OMX_VIDEO_AVCLEVELTYPE常数来表示传给MediaFormat的水平)。

不知道这是否有帮助,但它至少值得一试。

+0

感谢您的回答mstorsjo。目前我正忙于其他事情。我会研究你的建议 – 2014-10-15 09:45:49

+0

即使我在Lenova 7000上也有同样的问题 - 一个设备,你的建议运行良好。谢谢。 – 2015-06-18 10:36:18

0

我已经试过Nexus 9与Nvidia HW编码器。唯一适用于我的是按名称选择编码器。我能够情景模式设置为编码器级别选择的值总是设置为13

请注意,如果您按类型选择编码器,它会选择谷歌的编码器和如上面提到的,它迫使轮廓基线。

1

下面是我在我的应用程序做了一个片段:

mediaFormat.setInteger("profile", 8); // Profile HIGH 
mediaFormat.setInteger("level", 0x200); // Level 3.1 

这里是配置文件值,你可以选择:

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 

而且层次:

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 

设置两者都很重要。

相关问题