1、进入板子debug环境 (根据自己情况)
1) mount /dev/sda3 /root/disk
2) minicom
3) nfs
pc:
sudo vi /etc/exports
/root/disk/hi3516 *(rw,sync,no_root_squash,no_subtree_check)
sudo /etc/init.d/nfs-kernel-server restart
sudo /etc/init.d/rpcbind restart
sudo ifconfig eth1 172.16.23.157
board:
ifconfig wlan1 172.16.23.158
mount -t nfs -o nolock 172.16.23.157:/root/disk/hi3516 /root/hi3516
注意mpp_smp_linux.tgz解压后目录名改成mpp才能编译
2、音视频数据循环采集
a. 在sample_venc.c文件中,海思官方是把采集到的数据都保存到文件中,我们需要更改到缓存里,以便后面推送到rtsp/rtmp/hls服务端。
for (i = ; i < s32ChnTotal; i++)
{
if (FD_ISSET(VencFd[i], &read_fds))
{
/*******************************************************
step 2.1 : query how many packs in one-frame stream.
*******************************************************/
memset(&stStream, , sizeof(stStream));
s32Ret = HI_MPI_VENC_Query(i, &stStat);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("HI_MPI_VENC_Query chn[%d] failed with %#x!\n", i, s32Ret);
break;
} /*******************************************************
step 2.2 : malloc corresponding number of pack nodes.
*******************************************************/
stStream.pstPack = (VENC_PACK_S*)malloc(sizeof(VENC_PACK_S) * stStat.u32CurPacks);
if (NULL == stStream.pstPack)
{
SAMPLE_PRT("malloc stream pack failed!\n");
break;
} /*******************************************************
step 2.3 : call mpi to get one-frame stream
*******************************************************/
stStream.u32PackCount = stStat.u32CurPacks;
s32Ret = HI_MPI_VENC_GetStream(i, &stStream, HI_TRUE);
if (HI_SUCCESS != s32Ret)
{
free(stStream.pstPack);
stStream.pstPack = NULL;
SAMPLE_PRT("HI_MPI_VENC_GetStream failed with %#x!\n", \
s32Ret);
break;
} /*******************************************************
step 2.4 : save frame to file
*******************************************************/
HisiPutH264DataToBuffer(&stStream);
/*s32Ret = SAMPLE_COMM_VENC_SaveStream(enPayLoadType[i], pFile[i], &stStream);
if (HI_SUCCESS != s32Ret)
{
free(stStream.pstPack);
stStream.pstPack = NULL;
SAMPLE_PRT("save stream failed!\n");
break;
}*/
/*******************************************************
step 2.5 : release stream
*******************************************************/
s32Ret = HI_MPI_VENC_ReleaseStream(i, &stStream);
if (HI_SUCCESS != s32Ret)
{
free(stStream.pstPack);
stStream.pstPack = NULL;
break;
}
/*******************************************************
step 2.6 : free pack nodes
*******************************************************/
free(stStream.pstPack);
stStream.pstPack = NULL;
}
}
b. HI_S32 HisiPutH264DataToBuffer(VENC_STREAM_S *pstStream)函数比较重要
HI_S32 HisiPutH264DataToBuffer(VENC_STREAM_S *pstStream)
{
HI_S32 i,j,x;
HI_S32 len=,off=,len2=,uplen=;
unsigned char *pstr;
int iframe=;
for (i = ; i < pstStream->u32PackCount; i++)
{
len+=pstStream->pstPack[i].u32Len;
}
if(n<NMAX)
{
for (i = ; i < pstStream->u32PackCount; i++)
{
memcpy(ringfifo[iput].buffer+off,pstStream->pstPack[i].pu8Addr,pstStream->pstPack[i].u32Len);
off+=pstStream->pstPack[i].u32Len;
pstr=pstStream->pstPack[i].pu8Addr; if(pstr[]==0x67)
{
UpdateSps(pstr+,pstStream->pstPack[i].u32Len-);
iframe=;
}
if(pstr[]==0x68)
{
UpdatePps(pstr+,pstStream->pstPack[i].u32Len-);
}
}
ringfifo[iput].size= len;
if(iframe)
{
// printf("I");
ringfifo[iput].frame_type = FRAME_TYPE_I;
}
else
{
ringfifo[iput].frame_type = FRAME_TYPE_P;
// printf("P");
}
iput = addring(iput);
// printf("(%d)",iput);
// fflush(stdout);
n++;
}
return HI_SUCCESS;
}
c. VENC_STREAM_S相关结构体
//定义帧码流类型结构体:
typedef structhiVENC_STREAM_S
{
VENC_PACK_S *pstPack; //帧码流包结构。
HI_U32 u32PackCount; //一帧码流的所有包的个数。
HI_U32 u32Seq; //码流序列号。 按帧获取帧序号;按包获取包序号。
}VENC_STREAM_S;
//定义帧码流包结构体:
typedef structhiVENC_PACK_S
{
HI_U32 u32PhyAddr[]; //码流包首地址。
HI_U8 *pu8Addr[]; //码流包物理地址。
HI_U32 u32Len[]; //码流包长度。
VENC_DATA_TYPE_U DataType; //码流类型。
HI_U64 u64PTS; //时间戳。单位:us。
HI_BOOL bFieldEnd; //场结束标识。 取值范围: HI_TRUE:该码流包是该场的最后一个包。 HI_FALSE:该码流包不是该场的最后一个包。
HI_BOOL bFrameEnd; //帧结束标识。 取值范围: HI_TRUE:该码流包是该帧的最后一个包。 HI_FALSE:该码流包不是该场的最后一个包。
}VENC_PACK_S;
struct ringbuf {
unsigned char *buffer;
int frame_type;
int size;
};
c. 数据采集到ringbuf缓存中,然后通过rtsp/rtmp/hls协议推送到服务端IP,客户端就可以通过网络来访问了。相关rtsp/rtmp/hls服务跟平台无关,在另外的随笔中已经整理了。
3、 运行上面的程序,会发现图像偏色,需要调整海思算法ISP的相关参数
HI3518平台视频画面偏色解决办法,有人已经整理了http://blog.csdn.net/zqj6893/article/details/50380092
4、HI3520DV200+GV7601采集1080P视频
http://blog.csdn.net/zqj6893/article/details/50386921
5、osd
http://bbs.ebaina.com/forum.php?mod=viewthread&tid=12659&extra=page%3D1&page=1