我正在开发的应用程序通过Surface从摄像头获取视频,并将其编码为视频/avc (H264),我正在成功地做到这一点,它在像galaxy Note 10+这样的手机上运行得很好,但在像小米note 10这样的手机上工作得很好,这是我正在发布的一款新手机。以下是我正在做的事情:
format = MediaFormat.createVideoFormat(
H264, videoWidth, videoHeight
).apply {
setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 0)
setInteger(MediaFormat.KEY_BIT_RATE, bitrate)
setInteger(MediaFormat.KEY_FRAME_RATE, videoFrameRate)
setInteger(
MediaFormat.KEY_COLOR_FORMAT,
CodecCapabilities.COLOR_FormatSurface
)
setFloat(MediaFormat.KEY_I_FRAME_INTERVAL, 1f)
}```
然后
val encoderName = MediaCodecList(
MediaCodecList.ALL_CODECS
).findEncoderForFormat(format) //using the format I shared in the first step
然后创建
codec = MediaCodec.createByCodecName(encoderName)
然后.setCallback(回调)//不重要,因为我们要到现在才能完成,它会在此之前崩溃。
4.这是它崩溃的地方。 codec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE) //CRASH => MediaCodec$CodecException: Error 0x80001001
codec.setInputSurface(surface)
codec.start()
我怀疑
setInteger(
MediaFormat.KEY_COLOR_FORMAT,
CodecCapabilities.COLOR_FormatSurface
) //I tried changing the value and completely removing this setInteger, no luck :/
发布于 2022-12-01 11:10:10
error 0x80001001
(也称为OMX_ErrorUndefined
)说:“有一个错误,但是不能确定错误的原因。”
造成此错误的最可能原因是资源不足。例如,如果您试图配置硬件编解码器,但目前没有足够的图形内存,就可能发生这种情况。
建议1:当你使用完编解码器时,一定要释放它们。您需要检查所有代码路径。
建议2:知道这是可能发生的,您可以过滤MediaCodecList
,保留所有支持给定格式的编码器。然后将configure()
调用包装在try
/catch
块中。如果调用失败,请尝试从编解码器列表中选择下一个选项。
注意,在大多数设备上,H264
至少有两个编解码器:硬件编解码器和软件编解码器。前者具有较好的性能,后者具有更强的弹性。
https://stackoverflow.com/questions/74373662
复制相似问题