1

我正在使用 Desktop Duplication 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 是另一回事。在我使用 MediaCodec 的 Android 上,我从解码器获取第一帧并将其用作 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 帧,这对网络来说很重。关于我做错了什么的任何想法?亡灵森林之书截图

4

0 回答 0