传递了MediaCodec配置,但实际上不支持输入分辨率

时间:2016-05-04 03:40:26

标签: android mediacodec

我通过MediaCodec API实现了一个视频编码器来编码2560x720视频。我在几台设备上验证了它,但我在Samsung Note 2(Android 4.4.2)上遇到了配置问题。以下是我准备编解码器实例的代码:

Format = MediaFormat.createVideoFormat("video/avc", 2560, 720);
Format.setInteger(MediaFormat.KEY_BIT_RATE, (int) (2560 * 720 * 20 * 0.5f));
Format.setInteger(MediaFormat.KEY_FRAME_RATE, RefreshRate);
Format.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420SemiPlanar);
Format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 1);

try {
    Codec = MediaCodec.createEncoderByType("video/avc");
    Codec.configure(Format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
    CodecFound = true;
} catch (Exception e) {
    CodecFound = false;
    if(DEBUG) Log.e(CodecTag, "Failed to find available codec", e);
}

在此try-catch块期间不会抛出异常。但是在启动编解码器操作之后,即使填充了输入缓冲区,编码器也不输出编码数据和输出格式(" dequeueOutputBuffer"总是返回-1)。以下是启动编解码器后的日志,其中报告了一些错误:

05-04 11:29:17.071: E/MFC_ENC(1006): SOMXVE_Init: isSEIOn : 0
05-04 11:29:17.071: E/MFC_ENC_APP(1006): SsbSipMfcEncInit]    IOCTL_MFC_ENC_INIT failed
05-04 11:29:17.111: A/libc(1006): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 1403 (AvcEncBufPrc)
05-04 11:29:19.326: E/VideoCodecInfo(1353): Failed to get track format due to codec error
05-04 11:29:25.606: E/ACodec(1353): OMX/mediaserver died, signalling error!
05-04 11:29:25.606: E/MediaCodec(1353): Codec reported an error. (omx error 0x8000100d, internalError -32)
05-04 11:29:25.606: E/AudioService(2462): Media server died.
05-04 11:29:25.606: E/Camera(1353): Error 100

我终于找到这些命令来获取Note 2中支持的媒体配置文件

adb shell cat /system/etc/media_codecs.xml

adb shell cat /system/etc/media_profiles.xml

根据配置文件列表,h264编码器可支持的最大分辨率为1920x1080

<VideoEncoderCap name="h264" enabled="true"
minBitRate="64000" maxBitRate="20000000"
minFrameWidth="176" maxFrameWidth="1920"
minFrameHeight="144" maxFrameHeight="1080"
minFrameRate="1" maxFrameRate="30" />

我的问题:

  1. 为什么编解码器可以使用不可接受的格式成功配置?这是与API级别相关的错误还是限制?
  2. 我听说有一些API用于检查Android 5.0中提供的这种功能,但我必须在我的应用程序中支持4.4。有没有其他方法可以在运行时获取详细的功能信息? (解析media_profile.xml除外)
  3. 任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:0)

mediaserver进程崩溃,显然是由于空指针取消引用。此过程管理与媒体编解码器硬件的所有交互。像这样的崩溃表明平台中存在一个错误,可能是在OEM的驱动程序实现中。

如果不支持此解析,则configure()调用失败。我的猜测是这个特定的实现有一个错误的检查。

我认为没有办法检查特定宽度x高度对是否适用于Android 4.4。你通常可以依赖常见的分辨率,如720p,但有些尺寸有奇怪的行为,特别是当你得到16的非倍数时。