各位大牛,本人现在遇到这样一个问题
现在项目有这么个需求,要将接收到的264码流分成两路,一路直接进行显示,一路保存成jpg文件。直接显示那一路没什么问题,保存jpg那一路送到编码器其中一个通道,生成的图像出现向右下角偏移的现象。
正常图片和异常图片分别如下:
link结构大致如下图所示:
接受的码流是双流,selectlink作用是把第一路筛选出来,把selectlink接在encoderlink的第四路,现做过以下尝试:
1、直接把selectlink的输出接显示的话是正常的
2、将编码格式由jpeg改为264,图像也是偏移的
3、编码器第三路是由capturelink采集的数据直接编jpeg,参数设置和第四路一样,图像正常
然后一直不明白问题出在哪,DVRRDK是4.0版本,第三路和第四路jpeg编码link参数设置如下所示:
for (i = 2; i < 4; i++) {
encPrm.chCreateParams[i].format = IVIDEO_MJPEG;//IVIDEO_H264BP; // IVIDEO_H264BP;//IVIDEO_H264HP;
encPrm.chCreateParams[i].fieldMergeEncodeEnable = FALSE;
encPrm.chCreateParams[i].enableAnalyticinfo = FALSE;
encPrm.chCreateParams[i].enableWaterMarking = FALSE;
encPrm.chCreateParams[i].enableHighSpeed = FALSE;
encPrm.chCreateParams[i].defaultDynamicParams.intraFrameInterval = 3000;
encPrm.chCreateParams[i].defaultDynamicParams.inputFrameRate = 60;
encPrm.chCreateParams[i].defaultDynamicParams.targetFrameRate = 1;
encPrm.chCreateParams[i].defaultDynamicParams.qpMin = 20;
encPrm.chCreateParams[i].defaultDynamicParams.qpMax = 50;
encPrm.chCreateParams[i].defaultDynamicParams.rcAlg = 0; //0 vbr //1 cbr
encPrm.chCreateParams[i].defaultDynamicParams.qpInit = -1;
encPrm.chCreateParams[i].defaultDynamicParams.vbrDuration = 8;
encPrm.chCreateParams[i].defaultDynamicParams.vbrSensitivity = 0;
}
解码link参数如下所示:
for (i = 0; i < 2; i++) {
decPrm.chCreateParams[i].format = IVIDEO_H264HP;
decPrm.chCreateParams[i].profile = IH264VDEC_PROFILE_ANY;
decPrm.chCreateParams[i].targetMaxWidth = 1920;
decPrm.chCreateParams[i].targetMaxHeight = 1080;
decPrm.chCreateParams[i].fieldMergeDecodeEnable = FALSE;
decPrm.chCreateParams[i].algCreateStatus =
DEC_LINK_ALG_CREATE_STATUS_CREATE;
if (i < 1) {
decPrm.chCreateParams[i].defaultDynamicParams.targetFrameRate = 60;
decPrm.chCreateParams[i].defaultDynamicParams.targetBitRate = 8000
* 1000;
decPrm.chCreateParams[i].numBufPerCh = 16;
} else {
decPrm.chCreateParams[i].defaultDynamicParams.targetFrameRate = 30;
decPrm.chCreateParams[i].defaultDynamicParams.targetBitRate = 4000
* 1000;
decPrm.chCreateParams[i].numBufPerCh = 16;
}
}
保存数据的方法是:
Bitstream_BufList fullBufList;
remotejpgfile = fopen("/Web/static/images/remote.jpg","wb");
localjpgfile = fopen("/Web/static/images/local.jpg","wb");
IpcBitsInLink_getFullVideoBitStreamBufs(SYSTEM_HOST_LINK_ID_IPC_BITS_IN_0, &fullBufList);
if ((pFullBuf->fillLength > 0) && (pFullBuf->channelNum == 2))
{
fseek(localjpgfile,0,0);
fwrite((char*)pFullBuf->addr, 1, pFullBuf->fillLength,localjpgfile);
fflush(localjpgfile);
}
if ((pFullBuf->fillLength > 0) && (pFullBuf->channelNum == 3))
{
fseek(remotejpgfile,0,0);
fwrite((char*)pFullBuf->addr, 1, pFullBuf->fillLength,remotejpgfile);
fflush(remotejpgfile);
}
求大拿们帮看下哪里可能出问题,非常感激!