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

HI35xx平台调试笔记的更多相关文章

  1. RC 522模块在LINUX平台调试笔记

    硬件平台: 1 主控:SMDK Exynos4412 POP S5M8767A 2 RFID模块:君盾集团提供的RC522模块 3 通信接口:SPI 软件平台:Android ICS & ke ...

  2. OpenCV开发笔记(七十四):OpenCV3.4.1+ffmpeg3.4.8交叉编译移植到海思平台Hi35xx平台

    前言   移植opencv到海思平台,opencv支持对视频进行解码,需要对应的ffmpeg支持.   Ffmpeg的移植   Ffmpeg的移植请参考之前的文章:<FFmpeg开发笔记(十): ...

  3. Tomcat调试笔记

    调试笔记 在使用Tomcat过程中经常碰到问题,导致tomcat启动失败.如下↓ 由于报错太过笼统,我根本无法找出错误.后来我切换到Console视图下,看到了如下错误信息. 根据报错信息,错误原因是 ...

  4. USB wifi调试笔记

    本文以realtek 8192CU WiFi模块为例,介绍USB wifi在Jelly Bean 4.1的调试笔记. 1.WIFI打不开现象概述 WiFi打不开是指您在UI的settings下选中Wi ...

  5. JavaScript特效(调试笔记)

    JavaScript特效 一.在网页上显示当前的时间日期,例如:“2016年3月26日 星期六”. js源代码: function getTime() { var today = new Date() ...

  6. ida动态调试笔记

    ida动态调试笔记 目标文件:阿里安全挑战赛的第二题 点击打开链接 使用环境:ida6.8点击打开链接,adt bundle点击打开链接 首先打开avd安卓模拟器,界面如下: 在dos下运行adb命令 ...

  7. modbus-poll和modbus-slave工具的学习使用——modbus协议功能码3的解析(及欧姆龙温控器调试笔记)

    最近的项目中使用到了欧姆龙的温控器,里面有很多的通信方式,我们使用的常见的modbus——RTU方式,其他方式我们不使用,其中通信手册上面有很多通信的实例,欧姆龙modbus还区分4字节模式和2字节模 ...

  8. 海思HI35xx平台软件开发快速入门之H264解码实例学习

    ref :https://blog.csdn.net/wytzsjzly/article/details/82500277   前言 H264视频编码技术诞生于2003年,至今已有十余载,技术相当成熟 ...

  9. 全平台Markdown笔记软件——Notable

    简介 The markdown-based note-taking app that doesn't suck. 一款简介.跨平台的本地笔记软件,github地址:https://github.com ...

随机推荐

  1. 面试常问小知识点之Integer

    背景 今天在查看Sonar的时候发现小伙伴在某些场景下如下使用 很明显sonar已经报错了,但是线上应用目前是正常的 问题 事实上经常会有面试的小伙伴或者笔试的小伙伴问这个问题 Integer的一些小 ...

  2. Linux编译安装PHP Mysql Nginx

    安装gcc g++等编译器 yum -y install gcc gcc-c++ automake autoconf libtool glibc make 安装一些lnmp依赖的库 yum -y in ...

  3. [Java] System.arraycopy 数组复制

    函数原型: public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) ; s ...

  4. 关于Cocos2d-x中自定义的调用注意事项

    1.在实例类Student.h中定义一个自己的方法 public: int getSno(); 2.在实例类Student.cpp中实现这个方法 int Student::getSno(){ retu ...

  5. Python 矩阵与矩阵以及矩阵与向量的乘法

    import numpy as np numpy模块的array相乘时,有两种方式:一是矩阵形式,二是挨个相乘. 需要用矩阵形式相乘时,则要用np.dot()函数. #矩阵与矩阵相乘a = np.ar ...

  6. Ubuntu Python 安装numpy SciPy、MatPlotLib环境

    安装 sudo apt-get install python-scipysudo apt-get install python-numpysudo apt-get install python-mat ...

  7. STL的map容器将第3个模板参数设为less_equal或greater_equal会怎样?

    最近都在学Linux系统编程,用C就足矣,有段时间没碰C++了,于是实现些算法练手. 实现多项式乘法的时候发现有几项没有合并同类项,最终调试到这一步时发现了问题. res是map类型,用find查找k ...

  8. ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功 ...

  9. 使用ANT编译项目报错 com.sun.image.codec.jpeg does not exist 解决方法

    项目开发中在对图片进行裁切处理的时候,有时候是会使用到 com.sun 包下的类时. 假设项目使用ant编译,会出现错误 com.sun.image.codec.jpeg does not exist ...

  10. android classloader双亲托付模式

    概述 ClassLoader的双亲托付模式:classloader 按级别分为三个级别:最上级 : bootstrap classLoader(根类载入器) : 中间级:extension class ...