客户端简历写法
项目概述
本项目为云视频会议, 云视频对讲等开发实战,分为前端和后端两部分,前端采用 QT 开发,后端采用 Linux C 开发。
前端概述
前端采用 QT 开发,通过 tcp 长连接和服务器进行音视频通信,功能包括创建会议,加入和退出会议,视频传输,聊天消息转发等功能。
包括的技术栈
socket 编程,视频帧抓取,消息队列,日志系统,音视频转发,发送队列,线程池,互斥锁,设计模式
简历项目表述
场景 1(Arm 终端门禁云对讲)
本产品为基于 QT 实现的云视频对讲系统,广泛用于视频门禁对讲。支持多端部署,Android, Windows, Arm 系统中。采用了 QT 内置的视频解码和帧抽取逻辑,实时传输视频图像,可靠传输。通过 Actor 设计模式,将多个子系统独立成不同的线程,包括发送帧图像,文本数据,语音对讲等信息,各个系统之间通过消息队列解耦。网络服务基于 tcp 实现异步收发,增加发送队列和接收队列,保证数据稳定。单服务器并发量支持 4000 台对讲设备且延迟率低于 10ms。
场景 2(医疗军工可视化对讲呼叫系统)
本产品为基于 QT 实现的云视频对讲系统,广泛用于医疗体系中呼叫传输。支持多端部署,Android, Windows, Arm 系统中。采用了 QT 内置的视频解码和帧抽取逻辑,实时传输视频图像,可靠传输。通过 Actor 设计模式,将多个子系统独立成不同的线程,包括发送帧图像,文本数据,语音对讲等信息,各个系统之间通过消息队列解耦,但服务器并发量支持 4000 台对讲设备且延迟率低于 10ms。
场景 3(windows 云视频会议系统)
本项目为基于 QT 实现的云视频会议即时通信产品,基于 QAbstractVideoSurface 实现自定义类抽取视频帧,将视频帧投递到帧队列中,由视频帧处理线程单独发送,实现逻辑解耦 和流量削峰。
为保证视频会议文本消息传输流畅,单独启用文本处理线程消费文本队列。网络线程收到数据后将消息按消息类型投递给不同的逻辑队列处理。采用封装继承多态的特性,基于 QWidget 实现自定义界面类,以及基于 QThread 自定义功能线程。采用 QLayout 布局分模块显示多路窗口视频,通过 QStackWidget存储不同的 QWidget,实现文本和视频显示切换。采用了 Actor 设计模式,进行流量解耦和削峰。
个人业绩
从 0 到 1 跟随团队开发,熟悉项目开发到产品测试发布全流程,项目内测稳定,容来百万投资。
增加视频解析线程,通过解析队列减缓卡顿,解决了视频流卡顿问题
网络线程发送数据存在混乱现象,增加了发送队列保证发送有序和线程安全。
记录日志时会影响视频采集流程,开发异步日志系统,减缓系统开销。
增加音频队列,用来接收对方音频消息,减轻全局接收队列负担。
面试常见问题:
1 已经存在腾讯会议了为什么还要研发视频会议系统?
公司音视频编程技术非常成熟,视频会议系统只是视频技术产品的一条产业链,不是所有。
包含门禁和车载的可视化对讲,医疗领域的可视化呼叫等,公司包含多条产业链。
就算只是视频会议系统:
1 该系统支持私有化部署(服务器可以部署局域网或者 arm 系统中),保证信息安全。(军工部门,私有企业保密单位)
2 该系统还支持云服务部署(广域网部署), ToB(对企业级的)
2 项目中采用了哪些设计模式?
单例模式: 网络模块,数据存储, mysql(远程服务),本地数据库(sqlite)
工厂模式: 封装实现细节。封装了一个工厂函数,根据传入的字符串信息,实例化不同的聊天对话框以及对话条目,增加封装性。
代理模式:增加传输代理类,将要发送的信息按照不同的类型投递给不同的代理,内部由代理将消息传递给发送队列。
Actor: 为增加并发性,将不同模块封装为线程类,独立后台运行,各模块采用消息队列通信解耦。
生产者消费者模式: 条件变量+互斥锁
3 数据结构和算法
1 消息队列,Queue , std::queue , 用链表封装的队列。
2 map 结构, std::map std::hash
3 图像和视频压缩,采用 QT 压缩二进制
4 设计发送队列和接收队列,包括生产者模式队列和消费者模式队列。
4 你解决了那些难题?
1 异步的日志库
2 音频的编码,包括压缩,和解压,以及发送,录制,播放等逻辑。
3 项目中存在网络乱序的情况,应用层发送的数据混乱,经过细心排查,因为异步发送需要发送队列,手动封装了发送队列。