gpt4 book ai didi

android - MediaCodec 配置通过,但实际上不支持输入分辨率

转载 作者:行者123 更新时间:2023-12-04 14:10:41 29 4
gpt4 key购买 nike

我通过 MediaCodec API 实现了一个视频编码器来编码 2560x720 视频。我在几台设备上进行了验证,但在三星 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 block 期间没有抛出异常。但是在开始编解码器操作后,即使输入缓冲区被填满(“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" />

我的问题:
  • 为什么编解码器可以以 Not Acceptable 格式成功配置?这是与 API 级别相关的错误还是限制?
  • 我听说有一些 API 可以检查 Android 5.0 提供的此类功能,但我的应用程序必须支持 4.4。有没有其他方法可以在运行时获取详细的能力信息? (解析 media_profile.xml 除外)

  • 任何帮助将非常感激。

    最佳答案

    mediaserver进程崩溃,显然是由于空指针取消引用。此过程管理与媒体编解码器硬件的所有交互。像这样的崩溃表明平台中存在错误,可能在 OEM 的驱动程序实现中。
    configure()如果不支持该分辨率,则调用应该失败。我的猜测是这个特定的实现有一个错误的检查。

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

    关于android - MediaCodec 配置通过,但实际上不支持输入分辨率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37018001/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com