今天碰到了一個很牛逼的錯誤呀,很簡單,就是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.
添加後所有的數據情況都正常了.