NVEnc编码和MediaCodec解码产生损坏的帧

时间:2019-12-07 02:45:58

标签: android encoding decoding mediacodec nvenc

我正在使用桌面复制API捕获帧

hr = pDup->AcquireNextFrame(wait, &frameInfo, &pResource);

预处理它们(RGB至NV12)

然后使用HEVC中存在的默认NVEnc对它们进行编码

pEnc->CreateDefaultEncoderParams(&encInitParams, NV_ENC_CODEC_HEVC_GUID, NV_ENC_PRESET_LOW_LATENCY_DEFAULT_GUID);
pEnc->CreateEncoder(&encInitParams);

直到这里一切正常,将输出保存到文件中表明一切正常。 通过网络将其发送到Android是另一回事。在Android上,我使用的是MediaCodec,我从解码器获取了第一帧并将其用作csd-0,以使用正确的配置文件配置异步解码器。在我的回调中,我有这个:

mCodec.setCallback(new MediaCodec.Callback() {
        @Override
        public void onInputBufferAvailable(@NonNull MediaCodec mediaCodec, int i) {
            if(data!=null){
                ByteBuffer inputBuffer = mediaCodec.getInputBuffer(i);
                inputBuffer.put(data, 0, data.length);

                mediaCodec.queueInputBuffer(i, 0, data.length, 0, 0);

            }
        }

        @Override
        public void onOutputBufferAvailable(@NonNull MediaCodec mediaCodec, int i, @NonNull MediaCodec.BufferInfo bufferInfo) {

            if(data!=null) {
                mediaCodec.releaseOutputBuffer(i, true);
            }
        }

数据由onReceiveMessage(byte [])设置。 我得到的结果是彼此不匹配的框架,结果只是一团糟(请参阅下面的屏幕截图)。唯一可行的方法是,如果我强制NVEnc仅发送IDR帧,那么这在网络上就很繁重。关于我在做什么错的任何想法吗? Forest Book of the Dead screenshot

0 个答案:

没有答案