今天碰到了一个很牛逼的错误呀,很简单,就是memcpy的问题.
首先看代码:
uint8_t *extra_data = enc_ctx->extradata;
int extra_data_size = enc_ctx->extradata_size;
printf("extra_data_size:%d \n" , extra_data_size);
uint8_t *__sps = extra_data + offset;
//寻找下一个pps即可
int inteval = offset;
bool find = false;
while( inteval < (extra_data_size - offset) )
{
if( extra_data[inteval] == 0x00 && extra_data[inteval+1] == 0x00 )
{
if(extra_data[inteval+2] == 0x01)
{
printf("find it 0x000001\n");
find = true;
break;
}
if(extra_data[inteval+2] == 0x00 && extra_data[inteval+3] == 0x01 )
{
printf("find it 0x00000001\n");
find = true;
break;
}
}
inteval++;
}
if(!find) return -1;
//copy sps
_sps_len = inteval - offset;
printf("sps len:%d --offset:%d \n" , _sps_len , offset);
*_sps = new uint8_t [_sps_len+1];//这里一定要+1否则可能回出现乱码,+1是为了存放最后的\0
memcpy(*_sps,enc_ctx->extradata + offset,_sps_len);
//copy pps
_pps_len = extra_data_size - offset - _sps_len - offset;
printf("pps len:%d \n" , _pps_len);
*_pps = new uint8_t [_pps_len+1];
memcpy(*_pps,extra_data + offset + _sps_len + offset,_pps_len);
//把sps/pps信息给补齐
char head [] {0x00,0x00,0x00,0x01};
FILE *fs = fopen("/opt/rbu/encode_data.264","wb+");
fwrite(head,4,1,fs);
fwrite(_sps,_sps_len,1,fs);
fwrite(head,4,1,fs);
fwrite(_pps,_pps_len,1,fs);
fclose(fs);
fs = fopen("/opt/rbu/sps.data","wb+");
fwrite(_sps,_sps_len,1,fs);
fclose(fs);
fs = fopen("/opt/rbu/pps.data","wb+");
fwrite(_pps,_pps_len,1,fs);
fclose(fs);
fs = fopen("/opt/rbu/sps_pps_extra.data","wb+");
fwrite(enc_ctx->extradata,enc_ctx->extradata_size,1,fs);
fclose(fs);
很简单,简单到什么程度呢? 中间的数据是我需要拷贝的,但是我拷贝过来后发现和原始的数据对比,怎么也对比不上,出现了乱码!
解决方案是:
uint8_t *sps = new uint8_t [len+1];
也就是多分配1个字节的空间,用于存放\0.
添加后所有的数据情况都正常了.