我们有一款将视频编码为H264的Android应用。在所有以前尝试过的Android设备上,这将编码为我需要的Baseline配置文件。
在联想Yoga 10上,编解码器是OMX.MTK.VIDEO.ENCODER.AVC。这会将视频编码为High Profile,这会给接收设备带来问题。
我正在使用MediaCodec。似乎没有办法设置要使用的配置文件。
有没有办法做到这一点?编解码器声称支持Baseline配置文件,但无法使用它。是否有针对此的编解码器特定参数?
答案 0 :(得分:3)
您可以尝试将密钥profile
添加到MediaFormat,其值为1
(OMX_VIDEO_AVCProfileBaseline
)。如果这样做,您可能还需要添加键level
,其级别值也与您的分辨率相匹配(使用OMX AVC级别常量中的值)。
我不确定这个编解码器是否真的尊重所请求的值,但它可能值得一试。
有关设置步骤的示例,请参阅https://android.googlesource.com/platform/frameworks/av/+/6ade04174/media/libstagefright/ACodec.cpp中的setupAVCEncoderParameters
功能。它在输入参数中查找profile
键(从您提供的MediaFormat中复制),但如果存在,您还需要提供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
(但传递给MediaFormat的级别需要使用OMX_VIDEO_AVCLEVELTYPE
来表达常数)。
不确定这是否有帮助,但至少值得一试。
答案 1 :(得分: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
设置两者都很重要。
答案 2 :(得分:0)
我在Nexus 9上用Nvidia HW编码器试过这个。只有对我有用的是按名称选择编码器。我能够将配置文件设置为编码器级别的选定值始终设置为13.
请注意,如果您按类型选择编码器,它会选择谷歌编码器,如上所述,它会强制配置文件到基线。