C++ 使用英伟达编码SDK编码的视频是不正确的

C++ 使用英伟达编码SDK编码的视频是不正确的,c++,c,nvidia,C++,C,Nvidia,使用英伟达编码SDK编码的视频是不正确的

使用英伟达编码SDK编码的视频是不正确的 <英伟达编码器SDK与英伟达帧缓冲捕获SDK集成。我在CUDA缓冲器中捕获帧,然后发送到英伟达编码器,以H.264格式进行编码。 然而,经过编码的视频并不是我想要的,它是一个完全粉红色的屏幕。 有没有任何理由可以解释为什么会发生这种情况


#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括“nvEncodeAPI.h”
#包括
//如果已安装CUDA工具包,则可以包含CUDA标头
//#包括“cuda.h”
//#包括“cuda_drvapi_dynlink_cuda.h”
#包括“cuda.h”
#包括“NvFBCUtils.h”
#定义应用程序第4版
#定义LIB_NVFBC_名称“libnvidia fbc.so.1”
#定义LIB_CUDA_名称“libcuda.so.1”
#定义N_帧10
/*
*CUDA入口点
*/
typedef CUresult(*CUINITPROC)(未签名的整数标志);
typedef CUresult(*CUDEVICEGETPROC)(CUdevice*设备,序号为整数);
typedef CUresult(*CUCTXCREATEV2PROC)(CUcontext*pctx,无符号int标志,cudev设备);
typedef CUresult(*CUMEMCPYDTOHV2PROC)(void*dstHost,CUdeviceptr srcDevice,size_t ByteCount);
typedef CUresult(*CUGETDEVICEPTR)(CUdeviceptr*dptr,大小字节大小);
静态CUINITPROC cuInit_ptr=NULL;
静态CUDEVICEGETPROC cuDeviceGet_ptr=NULL;
静态CUCTXCREATEV2PROC cuCtxCreate_v2_ptr=NULL;
静态cummcpydtohv2proc cummcpydtoh_v2_ptr=NULL;
静态CUGETDEVICEPTR CUGETDEVICEPTR=NULL;
typedef NVENCSTATUS(*PNVENCCREATEINSTANCE)(NV_编码_API_函数_列表*PFUNList);
/**
*动态打开CUDA库并解析
*此应用程序需要。
*
*\param[out]libCUDA
*指向打开的CUDA库的指针。
*
*\返回
*成功时为NVFBC_TRUE,否则为NVFBC_FALSE。
*/
静态NVFBC_BOOL cuda_load_库(void*libCUDA)
{
libCUDA=dlopen(LIB_CUDA_NAME,RTLD_NOW);
if(libCUDA==NULL){
fprintf(stderr,“无法打开“%s”\n”,LIB\u CUDA\u名称);
返回NVFBC_FALSE;
}
cuInit_ptr=(CUINITPROC)dlsym(libCUDA,“cuInit”);
if(cuInit_ptr==NULL){
fprintf(stderr,“无法解析符号'cuInit'\n”);
返回NVFBC_FALSE;
}
cuDeviceGet_ptr=(CUDEVICEGETPROC)dlsym(libCUDA,“cuDeviceGet”);
if(cuDeviceGet_ptr==NULL){
fprintf(stderr,“无法解析符号'cuDeviceGet'\n”);
返回NVFBC_FALSE;
}
cuCtxCreate_v2_ptr=(CUCTXCREATEV2PROC)dlsym(libCUDA,“cuCtxCreate_v2”);
if(cuCtxCreate_v2_ptr==NULL){
fprintf(stderr,“无法解析符号'cuCtxCreate_v2'\n”);
返回NVFBC_FALSE;
}
cummcpydtoh_v2_ptr=(cummcpydtohv2proc)dlsym(libCUDA,“cummcpydtoh_v2”);
if(cuMemcpyDtoH_v2_ptr==NULL){
fprintf(stderr,“无法解析符号'cuMemcpyDtoH_v2'\n”);
返回NVFBC_FALSE;
}
cuGetDevicePtr=(cuGetDevicePtr)dlsym(libCUDA,“cuMemAlloc”);
if(cuGetDevicePtr==NULL){
fprintf(stderr,“无法解析符号'cuMemAlloc'\n”);
返回NVFBC_FALSE;
}
返回NVFBC_TRUE;
}
/**
*初始化CUDA并创建CUDA上下文。
*
*\param[in]cuCtx
*指向已创建CUDA上下文的指针。
*
*\返回
*成功时为NVFBC_TRUE,否则为NVFBC_FALSE。
*/
静态NVFBC布尔cuda初始化(CUcontext*cuCtx)
{
治愈结果治愈;
cuDev设备;
治愈率=cuInit_ptr(0);
如果(治愈!=CUDA_成功){
fprintf(stderr,“无法初始化CUDA(结果:%d)\n”,修复);
返回NVFBC_FALSE;
}
cuRes=cuDeviceGet_ptr(&cuDev,0);
如果(治愈!=CUDA_成功){
fprintf(stderr,“无法获取CUDA设备(结果:%d)\n”,治愈);
返回NVFBC_FALSE;
}
cuRes=cuCtxCreate_v2_ptr(cuCtx,cuCtx_SCHED_AUTO,cuDev);
如果(治愈!=CUDA_成功){
fprintf(stderr,“无法创建CUDA上下文(结果:%d)\n”,修复);
返回NVFBC_FALSE;
}
返回NVFBC_TRUE;
}
/**
*初始化NvFBC和CUDA库并创建NvFBC实例。
*
*使用CUDA互操作创建并设置到视频内存的捕获会话。
*
*每秒捕获一组帧,将其转换为BMP并保存
*到磁盘。
*/
int main(int argc,char*argv[])
{
/英伟达编码器库的打开
void*handle=dlopen(“libnvidia encode.so”,RTLD_NOW);
if(handle==NULL)
{
PrTNF(“无法加载英伟达编码器库”);
返回退出失败;
}
PNVENCCREATEINSTANCE NvEncCreateInstance_ptr;
NvEncCreateInstance_ptr=(PNVENCCREATEINSTANCE)dlsym(句柄,“nVencodeAppCreateInstance”);
if(NvEncCreateInstance_ptr==NULL)
{
printf(“加载nv编码库失败”);
}
静态结构选项longopts[]={
{“get status”,无参数,NULL,'g'},
{“track”,必选参数,NULL,'t'},
{“frames”,必选参数,NULL,'f'},
{“size”,必需的参数,NULL,'s'},
{“格式”,必需的参数,NULL,'o'},
{NULL,0,NULL,0}
};
int opt,ret;
无符号整数i,nFrames=N_帧;
NVFBC_SIZE frameSize={0,0};
NVFBC_BOOL printStatusOnly=NVFBC_FALSE;
NVFBC_TRACKING_TYPE trackingType=NVFBC_TRACKING_默认值;
char outputName[NVFBC_OUTPUT_NAME_LEN];
uint32_t outputId=0;
void*libNVFBC=NULL,*libCUDA=NULL;
PNVFBCCREATEINSTANCE NvFBCCreateInstance_ptr=NULL;
NVFBC_API_函数_列表pFn;
CUcontext-cuCtx;
NVFBCSTATUS fbcStatus;
NVFBC_BOOL fbcBool;
NVFBC_会话_处理fbcHandle;
NVFBC_创建_句柄_参数createHandleParams;
NVFBC_获取_状态_参数statusParams;
NVFBC_创建_捕获_会话_参数createCaptureParams;
NVFBC_销毁_捕获_会话_参数销毁捕获参数;
NVFBC_DESTROY_HANDLE_PARAMS DESTROY handleparams;
NVFBC_TOCUDA_SETUP_参数setupParams;
NVFBC_BUFFER_FORMAT bufferFormat=NVFBC_BUFFER_