我正在使用 NdkMediaCodec 。我成功创建了 decoder ,但在 编码器 创建时失败了。 以下是我尝试这样做的方法:
AMediaCodec* codec = AMediaCodec_createEncoderByType("video/avc");
if (codec != NULL) {
// fill the format
AMediaFormat* format = AMediaFormat_new();
if (format != NULL) {
ANativeWindow* surface = NULL;
AMediaCrypto * crypto = NULL;
uint32_t flags = AMEDIACODEC_CONFIGURE_FLAG_ENCODE;
int32_t height = 288;
int32_t width = 384;
int32_t frameRate = 30;
int32_t bitRate = 320;
AMediaFormat_setString(format, AMEDIAFORMAT_KEY_MIME, "video/avc");
AMediaFormat_setInt32(format, AMEDIAFORMAT_KEY_HEIGHT, height);
AMediaFormat_setInt32(format, AMEDIAFORMAT_KEY_WIDTH, width);
AMediaFormat_setInt32(format, AMEDIAFORMAT_KEY_BIT_RATE, bitRate);
AMediaFormat_setInt32(format, AMEDIAFORMAT_KEY_FRAME_RATE, frameRate);
AMediaFormat_setInt32(format, AMEDIAFORMAT_KEY_COLOR_FORMAT, 21); // #21 COLOR_FormatYUV420SemiPlanar (NV12)
media_status_t rc = AMediaCodec_configure(codec, format, surface, crypto, flags);
if (AMEDIA_OK == rc) {
AMediaCodec_start(codec);
return 0;
} }
我总是在下一次错误:
时失败了E/ACodec(3484): [OMX.qcom.video.encoder.avc] configureCodec returning error -38
E/ACodec(3484): signalError(omxError 0x80001001, internalError -2147483648)
E/MediaCodec(3484): Codec reported err 0x80001001, actionCode 0, while in state 3
E/MediaCodec(3484): configure failed with err 0x80001001, resetting...
E/OMX-VENC-720p(184): ioctl VEN_IOCTL_CMD_READ_NEXT_MSG failed
E/OMX-VENC-720p(184): Destroy C2D instance
I/OMXClient(3484): Using client-side OMX mux.
E/OMX-VENC-720p(184): Is component secure 0
E/NdkMediaCodec(3484): sf error code: -2147479551
E/OMX-VENC-720p(184): ioctl VEN_IOCTL_CMD_READ_NEXT_MSG failed
我还尝试了 AMediaFormat_setInt64 方法。但没有成功。
我的设备 Nexus 7(2013)。 API 5.1.1 。
请帮忙!
答案 0 :(得分:0)
我可以在您的代码中看到两个潜在问题:
比特率需要以每秒比特数表示,而不是以每秒千比特数表示。编解码器可能认为每秒320比特是不合理的低并且拒绝使用该参数进行配置。
其次,您确定编码器支持21种颜色格式吗?我认为它可能会这样做,但总的来说,在决定之前,你需要检查编码器支持的颜色格式列表。