AMediaCodec_configure()在NDK MediaCodec中的编码器失败

时间:2016-12-08 17:57:05

标签: android android-ndk mediacodec

我正在使用 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

请帮忙!

1 个答案:

答案 0 :(得分:0)

我可以在您的代码中看到两个潜在问题:

比特率需要以每秒比特数表示,而不是以每秒千比特数表示。编解码器可能认为每秒320比特是不合理的低并且拒绝使用该参数进行配置。

其次,您确定编码器支持21种颜色格式吗?我认为它可能会这样做,但总的来说,在决定之前,你需要检查编码器支持的颜色格式列表。