我正在使用桌面复制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帧,那么这在网络上就很繁重。关于我在做什么错的任何想法吗?