最近做海思35xx进行视频推流的项目,下面是在开发过程中的一些记录,我一般会把临时想起来的东西就记录在本子上,所以一个本子上可能什么方面的资料都有。所以大家就当流水帐阅读,可能有误,或者个人理解有不到位的地方,大家多多交流。这是一个开头,后面我会把遇到的问题点慢慢都记录下来。
项目背景:
这是目前还没有完全收工做完的一个项目,基本差不多了。在无人机上机进行视频采集,然后通过网络传输到服务器。可以用于无人职守、现场勘测,监控等人员不方便亲到现场的场景。其实这是一个很独立的模块,可以安装到所有移动载体上进行视频采集、传输。当然随着具体使用场景的不同,一些匹配的硬件或结构可能要变,软件上的一些异常处理策略可能需要修改,但是大框架应该是不用动的。
项目简要说明:
硬件采用海思35xx,除了主要考虑其编解码器外,还考虑后期进行视频分析计算。35xx具体的参数可以参考相关硬件说明,总之这货挺猛的。不过这几天据说由于美国参与,台积电不接单了,海思35xx价格翻倍了,顺带着联发科和高通的芯片都水涨船高。无线这块采用现在市面上比较通用的LC66xx,还有4G。LC66xx这货吧,也还行,只是我们的功率不能大,所以很容易受到干扰。3-5公里,一点事没有,5-8公里问题也不大,只是有一点,二者之间不能有遮挡。另外,在大街上,有车牌抓拍的环境,也会断线。总之,只要附近有同频设备在使用,80%以上概率LC66xx会受影响,除非提高功率。
视频输入有三种接口,hdmi、usb、ip-camera,hdmi直接转mipi,35xx把这个视频来源当成摄像头来操作,获得视频数据直接编码264或265,该推流就推流,该存储就存储。usb接口摄像头需要先解码再编码,然后 操作和hdmi一样。ip-camera不经过编解码,直接进行解封装再重新封装,然后只推流。具体每一路视频怎么操作,根据配置文件进行。具体数据处理流程是这样的:海思硬件进行视频采集,编解码,然后调用ffmpeg接口按照协议格式解封装或封装后,从网络推到指定服务器。
我的职责主要在底层,说的直接点就是对海思sdk进行二次封装。海思sdk不对业务负责。但是经过我的包装,业务层只要设置某接口,进行推流或存储即可,另外三率(码率,分辨率,帧率)可设置。然后给业务层小伙子提供2个库,一个是海思的打包库,一个是我的封装库。都是so库。
主要技能点:
1 要使用ffmpeg,有许多依赖库,这里需要你有较大型cmake和makefile的组织与编写技能,并且要熟悉各个库的配置参数,如果不熟悉,多试几次。我在移植srt的时候,现在感觉不是那么难,但是当时我感觉这些技能点怎么这么散啊,没办法,不知道怎么做的时候,干就是了。
2 硬件的一些知识必须了解,视频的基本知识也得必须了解,否则你会无从下手。另外你得会结合硬件使用海思提供的例子,修改例子,从例子当中抓取能在你项目中使用的信息,不停的修改,不停的尝试。你需要详细阅读海思的文档,很详细的阅读。
3 软件技能,多线程,同步和互斥,socket编程技能必须熟练点,否则你会很费劲,函数指针与回调函数在sdk中也经常使用。另外由于要写sdk,所以有一些具体实现上的注意点,如sdk只实现动作和状态,不涉及策略,直白点就是sdk很苦逼:只负责干,你让我怎么做我就怎么做,让我做几次我就干几次,你想要什么我就给什么。另外个人感觉最主要的部分是异常处理,这个属于最细节的部分,如网络信号不理想,需要链接线路切换,或者网络突然断线、超时等状况的时候,就是检查你的软件是否够强壮的时刻。还有下面几点:
1 因为要提供库给别人,所以就需要考虑库的存储空间和调用成本;
2 库是不参与源代码编译时刻的优化的,库能带来很大的好处,但是也要了解它的短板;
3 在数据结构上进行一些数据压缩、拆分、合并等手段能进行一些提高数据密度的操作;
4 循环结构的拆分,合并有时候也对效率有很大影响,其实3和4都是对缓存的高效使用;
5 减少代码中if-else
就想到这么多吧,说的有点远了,跑题。
个人认为一个优秀的软件产品功能最多只占30%,细节处理上40%,产品化集成30%吧,可能不够全面。暂且就这么认为吧。这里你和产品经理或部门领导汇报的时候一定要注意,如果你把功能实现和他们说差不多做完了,他们可能会认为项目差不多可以交付了,这其中的区别是很大的啊。一句话:功能不是产品,产品需要打磨。
4 系统集成技能,这个也算是基本技能吧,包括环境搭建,系统编译,文件系统制作。这里我主要考虑的可维护性,实用性,可生产性等和生产、维护相关属性。
最后在添加一点个人经验:不要着急动手,先好好想结构,包括代码结构和数据结构。软件最好先根据需求写测试程序,测试程序最好能一键自动全部执行,测试程序先写必须的功能测试部分,然后写功能代码,在功能代码能通过测试前,不往前推进度。等到当前功能通过测试,再添加另外一个功能,然后再把前面所有的测试走一遍。开始可能会感到好麻烦,等你试运行一段时间,你会发现这是一个非常好的方式。避免出现写了不少代码,运行测试发现前面原来运行正常的功能不正常的现象,如果出现的话,你还得不断的注释,不断的测试来排查问题。由于大量注释加修改,最后还会带来其它隐患。
阅读(8704) | 评论(0) | 转发(0) |