各位大牛,本人现在遇到这样一个问题
现在项目有这么个需求,要将接收到的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);
}
求大拿们帮看下哪里可能出问题,非常感激!
Chris Meng:
你好,
看起来像是编码输入的buffer首地址偏移了,和编码的参数应该没有直接关系。
你看看编码使用的buffer的首地址是在编码link获取的时候就发生变化了,还是在使用的时候?
1990 yang:
回复 Chris Meng:
Chris Meng
你好,
看起来像是编码输入的buffer首地址偏移了,和编码的参数应该没有直接关系。
你看看编码使用的buffer的首地址是在编码link获取的时候就发生变化了,还是在使用的时候?
qinzhan chen:
回复 1990 yang:
您好!
请问您的问题解决了吗?我现在转码也遇到了一样的问题,使用如下LINK的时候:ipc_bits_out_host->ipc_bits_in_video_id->dec->enc->ipc_bits_out_video->ipc_bits_in_host就会出现图像偏移。
1990 yang:
回复 qinzhan chen:
据说和编码器版本有关系,后来我没再关注过这个问题,您看有没有帮助e2echina.ti.com/…/339783
qinzhan chen:
回复 1990 yang:
感谢您的回复。
那您的问题解决了吗?是通过获取新的codec解决的还是用其他方法解决的?
1990 yang:
回复 qinzhan chen:
用的其他方法,因为我不方便拿最新版本的rdk,就直接调第三方库把那个边给裁剪了