我通过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" />
我的问题:
任何帮助都会非常感激。
答案 0 :(得分:0)
mediaserver
进程崩溃,显然是由于空指针取消引用。此过程管理与媒体编解码器硬件的所有交互。像这样的崩溃表明平台中存在一个错误,可能是在OEM的驱动程序实现中。
如果不支持此解析,则configure()
调用应失败。我的猜测是这个特定的实现有一个错误的检查。
我认为没有办法检查特定宽度x高度对是否适用于Android 4.4。你通常可以依赖常见的分辨率,如720p,但有些尺寸有奇怪的行为,特别是当你得到16的非倍数时。