我正在使用 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 帧,这对网络来说很重。关于我做错了什么的任何想法?