使用Samsung Galaxy S6上的Android MediaCodec编码HEVC时出错

时间:2017-08-16 04:02:22

标签: android mediacodec hevc

我尝试在Android MediaCodec中使用HEVC编码器支持我的流应用。 当我使用H64时它会成功,但当我切换到HEVC时会崩溃。

我在三星Galaxy S6上使用Android 7.0测试过,当我将缓冲区排队到编码器时崩溃了。 使用MediaRecorder和HEVC时没问题。

我的初始化代码:

        MediaFormat format = MediaFormat.createVideoFormat(CUR_CODEC, 640, 480);
        format.setInteger(MediaFormat.KEY_BIT_RATE, 500000);
        format.setInteger("bitrate-mode", 2);
        format.setInteger(MediaFormat.KEY_COLOR_FORMAT, COLOR_FormatYUV420Flexible);
        format.setInteger(MediaFormat.KEY_FRAME_RATE, 30);
        format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, -1);

        try {
            mEncoder = MediaCodec.createEncoderByType(CUR_CODEC);
        } catch (IOException e) {
            e.printStackTrace();
        }

        mEncoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
        mEncoder.start();
        outputBuffers = mEncoder.getOutputBuffers();

使用日志运行成功:

8-16 10:53:22.120 2285-2285/com.example.hanhnv.camapp I/ACodec:  [] Now uninitialized
08-16 10:53:22.121 2285-5049/com.example.hanhnv.camapp I/ACodec: [] onAllocateComponent
08-16 10:53:22.125 2285-5049/com.example.hanhnv.camapp I/OMXClient: MuxOMX ctor
08-16 10:53:22.134 2285-5049/com.example.hanhnv.camapp I/ACodec: Set Google AAC Dec for aacProfile 0
08-16 10:53:22.190 2285-5049/com.example.hanhnv.camapp I/ACodec: [OMX.Exynos.HEVC.Encoder] Now Loaded
08-16 10:53:22.196 2285-5049/com.example.hanhnv.camapp I/ACodec: [OMX.Exynos.HEVC.Encoder] using color format 0x13 in place of 0x7f420888
08-16 10:53:22.202 2285-5049/com.example.hanhnv.camapp I/ACodec: Success set VideoMinQP(0/0/0) VideoMaxQP(50/50/50)
08-16 10:53:22.203 2285-5049/com.example.hanhnv.camapp I/ACodec: [OMX.Exynos.HEVC.Encoder] cannot encode color aspects. Ignoring.
08-16 10:53:22.203 2285-5049/com.example.hanhnv.camapp I/ACodec: [OMX.Exynos.HEVC.Encoder] cannot encode HDR static metadata. Ignoring.
08-16 10:53:22.203 2285-5049/com.example.hanhnv.camapp I/ACodec: setupVideoEncoder succeeded
08-16 10:53:22.222 2285-5049/com.example.hanhnv.camapp I/ACodec: [OMX.Exynos.HEVC.Encoder] Now Loaded->Idle
08-16 10:53:22.256 2285-5049/com.example.hanhnv.camapp I/ACodec: [OMX.Exynos.HEVC.Encoder] Now Idle->Executing
08-16 10:53:22.258 2285-5049/com.example.hanhnv.camapp I/ACodec: [OMX.Exynos.HEVC.Encoder] Now Executing

这是我的编码:

        ByteBuffer data = mNewFrame.duplicate();
        ByteBuffer[] inputBuffers = mEncoder.getInputBuffers();
        int inputBufferIndex = mEncoder.dequeueInputBuffer(0);
        if (inputBufferIndex >= 0) {
            inputBuffer = inputBuffers[inputBufferIndex];
            inputBuffer.clear();
            inputBuffer.put(data);
            mEncoder.queueInputBuffer(inputBufferIndex, 0, mNewDataSize, System.currentTimeMillis(), 0);
            Log.d(TAG, "addFrame " + System.nanoTime() / 1000 + "data size=" + mNewDataSize);

            mTotalFrame++;
            getEncodedFrame();

            mNewFrame = null;
            return true;
        }

当我使用dequeInputBuffer或queueInputBuffer并使用log崩溃时出现错误:

08-16 10:53:22.293 3195-5087/? E/ExynosVideoEncoder: MFC_Encoder_Set_EncParam: Failed to SetControls
08-16 10:53:22.293 3195-5087/? E/EXYNOS_HEVC_ENC: [0xe4c1b500][HEVCCodecSrcSetup] Failed to set encParam
08-16 10:53:22.293 3195-5087/? E/EXYNOS_HEVC_ENC: [0xe4c1b500][Exynos_HEVCEnc_SrcIn] Failed to HEVCCodecSrcSetup(0xe8009000)
08-16 10:53:22.294 2285-5049/com.example.hanhnv.camapp E/ACodec: [OMX.Exynos.HEVC.Encoder] ERROR(0x80001000)
08-16 10:53:22.294 2285-5049/com.example.hanhnv.camapp E/ACodec: signalError(omxError 0x80001000, internalError -2147483648)
08-16 10:53:22.294 2285-5048/com.example.hanhnv.camapp E/MediaCodec: Codec reported err 0x80001000, actionCode 0, while in state 6

我认为我在编码之前使用了错误的编码设置。如果将编解码器更改为H264,它会成功运行。 任何人都可以帮助我。 感谢您的关注。

0 个答案:

没有答案