This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

DM8168中264码流解码重新编码成jpeg,图像出现偏移

各位大牛,本人现在遇到这样一个问题

现在项目有这么个需求,要将接收到的264码流分成两路,一路直接进行显示,一路保存成jpg文件。直接显示那一路没什么问题,保存jpg那一路送到编码器其中一个通道,生成的图像出现向右下角偏移的现象。

正常图片和异常图片分别如下:

link结构大致如下图所示:

接受的码流是双流,selectlink作用是把第一路筛选出来,把selectlink接在encoderlink的第四路,现做过以下尝试:

1、直接把selectlink的输出接显示的话是正常的

2、将编码格式由jpeg改为264,图像也是偏移的

3、编码器第三路是由capturelink采集的数据直接编jpeg,参数设置和第四路一样,图像正常

然后一直不明白问题出在哪,DVRRDK4.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);
}

求大拿们帮看下哪里可能出问题,非常感激!