leningrad是什么?
Leningrad是一套实时音视频通信解决方案,包含了android客户端, 服务器和后台监控系统。
1.采用p2p技术。
2.支持适配了多个机型。
(1).meizu机型信息:more than 30
M86, M96, M1712, M1881, M1871, M1891, M1792, M1793 ...
(2).other phones:
HuaWei, xiaomi, oppo, Vivo, samsung
leningrad带来的关于敏捷开发的思考?
同normandie一样,leningrad也受到了开发人员减少得不到补充的困扰,与normandie不同的是normandie是在早期1.0还未发布前,而leningrad是在中后期,第一个业务上线时。
人员的减少带来了很痛苦的一年,之前看过一些敏捷开发的介绍,当时突然觉得里边有些方法实际上以比较充足的人力配置为前提的,有些情况下并不适用。
History: Android sdk and service
v1.0.0
webrtc 实现远程协助功能
init the open source project
服务器端通过webrtc获取手机屏幕数据并发送
客户端获取用户执行命令并通过DataChannel发送,服务器端通过DataChannel接受并注入执行命令
voip默认已经OK
至此版本主要数据流都已打通
add screen record, add pauseCapture/resumeCapture interface, which open source was not implemented
add .gitinore for unchange files
保证在非正常退出后再进入能够正确初始化event_tracer.cc全局静态变量.在非正常退出后,不初始化全局静态变量会导致程序卡死甚至死机
修改视频编码相关参数1. vp8换成h264 2. 软编码解码改为硬件编码解码 3. IsScreencast返回true
添加转屏设置接口
三星机器添加硬件解码支持
分拆encoder 和 sender 线程, 性能
v1.1.0
重构apprtc, 分层
将apprtc分为, UI相关的demo层, 与应用程序员集成需要的接口层, 处理webrtc协议的房间服务器信令服务器的java层, webrtc核心,libjingle层
实现链接码重复请求更新机制--客户端,对于相同发送对象,15分钟再次发送的验证码保存一致;15分钟外发送新验证码,对于不同发送对象,发送的验证是新的验证码
启用java-websocket库,wss(https)支持
websocket keep alive机制
处理转屏后显示及操作坐标问题
添加获取房间信息接口-客户端
添加录屏帧率控制
减小I帧间隔时间, 检测帧率趋势防止进入静止状态后长期无I帧
解决用户帮助集成远程助手在android6.0上关闭app的系统设置权限后,用户帮助闪退的问题
远程助手-客户端-在某些平台(或机型)硬解码yuv对齐导致的远程桌面显示绿条问题解决
强制h264 profile baseline编码,规避webrtc不支持h264 cabac编码的问题 ,目前webrtc不支持cabac,网上也没有相关支持的patch,profile baseline肯定没有cabac,如果采用cabac有什么优缺点暂不明确
屏蔽部分test/demo的编译,更改libjingle_peerconnection_so.so的拷贝位置
规避极端情况下event_tracer中RTC_CHECK event logger为NULL
修复EventLogger重复分配内存泄漏
修复VP9 codec在webrtc工程里不能正常使用的问题,同等分辨率vp9跟vp8编码效果差不多,但vp9占用带宽较少
支持webrtc动态设置硬件编码器(原来h264写死),并且在vp8,vp9硬编码列表增加mtk,exynos平台,不是所有平台都有vp9目前,vp8都有,硬件编码
add how to update vpx soft codecs of webrtc
远程助手语音清晰度差,add audio_jitter_buffer_fast_accelerate 处理网络抖动问题,increase buffer size of AudioRecord
提交libvpx 1.6.0代码
提供striped的libjingle_peerconnection_so.so,增加Makefile指定编译库目标,减少编译时间
v1.3.0
升级webrtc代码
screen视频数据走标准capturer通道,virtualdisplay 由jingle库管理
优化视频jitter处理
优化aecm处理
webrtc版本没有实现,后来升级实现了,但我们自己也实现了
1.screenCapatureAndroid类用于屏幕抓取
2.libvpx从1.5.0升级到1.6.0
3.opus从v1.1.2升级到1.1.3
4.mediacodec decoder硬解yuv对齐导致的视频绿条问题
5.不支持h264 cabac编码格式,check退出应用问题;仍然不支持,但不会check失败;我们的解决方案是强制baseline profile
6.MediaProjection生命周期管理及做单例处理
7.virtualdisplay的生命周期管理
8.g_event_logger内存重复分配导致的内存泄漏
webrtc升级也没实现的
1.vp9 software codecs不能使用
2.不能动态设置hw codec默认vp8
3.mediacodec某些格式不支持exynos,mtk平台
4.在android6.0关闭应用的系统设置权限崩溃的问题
5.减小h264 i帧间隔
6.使用单例,避免jingle库不支持多实例的问题
7.peerconnectionclinet状态机
8.room fetcher状态机
9.quality scaler;scale梯度不够平滑
10.quality scaler; scale up速度算法调整
11.screenCapatureAnroid接口不够丰富,不能满足业务需要
12.静音处理,不用audio manager用remote track
13.跟电话之类的交互,rtc audio manager
v1.5.0
修复webrtc h264 automatic resize(根据网络/发送情况)导致的花屏问题
即在编码方自动动态设置视频分辨率(根据网络情况),解码方切换不同分辨率视频进行解码时花屏
主要是mediacodec encoder使用问题引起的, 有些底层框架对分辨率长宽的大小有对齐要求, 最少是2的倍数
新的automatic resize video算法替换webrtc的算法,旧的算法scale梯度不太平滑
优化video encoding automatic resize:scale up的时候,采用fast rampup模式,加快切换到更高分辨率的速度
jingle库裁剪,尽量减小so库大小
优化视频质量和实时性, 平衡视频质量,分辨率和带宽占用
在native库添加获取校验码接口, 增加服务器访问安全校验机制,防止dos攻击
解决横屏没有竖屏清晰的问题, rotation的时候重新初始化宽高
优化声音录制和播放
在魅族手机(mtk,exynos)平台带宽使用在某些情况下上不去的问题分析研究
不准确的delay based estimating bandwidth ,有send bandwith/rtt/incomming bandwidth就可以了
设置视频允许的最大带宽
强制设置H264编码器,无论在什么平台不产生B帧
b帧会有延迟,且在丢包的情况下容易发生问题
M81做为帮助方,连接成功后,必现求助方发送过来的视频显示为绿屏, compatibility issue of mtk low SoC hw decoder+surfacetexture
M80为求助方,帮助方点击应用时会在M80上会响应成ForceTouch, the root cause: pressure is always 1.0 on non-3d press phones
使用单个datachannel实现双向通信
在帮助段新增BrowserTouchEvent 处理broswer发送过来的触摸事件
同步api接口内部调用状态(v1.0)
解决一些稳定性问题,比如断开后helper或requestor操作peer,datachannel相关接口会block或状态不对引起的webrtc库的assert问题
1.rtcclient,peer,datachannel相关调用和影响状态的回调在一个looper里顺序执行,保证状态同步
2.初始条件的检查,保证重要的条件被设置
3.某些重要函数防止重复进入
4.peer,datachannel相关操作必须在peer connected或data channel open之后才能操作
实现"允许/拒绝对方控制功能",并增加API接口
mute/unmute对方声音功能,新增接口setRemoteAudioTrackEnable
在帮助方持续操作的情况下(恶意的),保证求助方“挂断”操作的即时响应,onTouch比onClick响应更早
解决virtualDisplay未释放导致的surfacefinger异常(进而导致系统异常)
解决异常情况下websocket出错或未连接状态下send函数报告异常导致app崩溃的问题
在远程协助过程中,来电话并且接听电话,语音通话声音变小, 挂断电话后,远程助手切换到之前自己的声音设备
重新整理错误断开状态码
app使用MediaProjection单例, 一个应用只有一个MediaProjection
[demo]动态适应不同屏幕分辨率,在所有屏幕上帮助方看到的视频窗口比例一致
rtcsdk接口添加非法参数检查
修复demo apk sdp的videobitrate和audiobitrate默认为0的问题,可能影响到带宽估算和分配
使用公司域名
修复displaylistener没有unregister的问题
重构rtcroom代码到rtcroom2(客户端)
参数放入requesttbody并加密,防止截包篡改问题
增加服务器version信息,方便以后升级的向后兼容问题
重构所有和房间服务器的代码到rtcroom2中
从安全家庭发起远程协助连接后,如果帮助方点击推送的“立即帮助“按钮时求助方立即取消帮助,帮助方将会卡在连接界面
1.在room connected之后,且peer创建了且未完全建立p2p连接,但对方提前离场,通过捕获channel状态增加错误提示
2.demo在requestor接受弹窗cancel时发送通知告诉对方,我这里cancel了或是拒绝了
v1.5.6
为https增加安全认证,防止在高版本android,7.0以后偶现的连接失败,导致获取不到房间号
更新语音参数,比如语音采样率切换到16000,跟微信一样
1.频率在一定的范围内,没有损失,所以语音质量并没有变化
2.采样率降低了,带宽相应降低到原来的1/3左右,所以延迟比原来低
3.原来采用low latency采样率,通过测试结果看,主要latency在网络传输,而不在音频输出重采样
【优化】增加系统时间异常情况下更新key的逻辑,防止key没有更新导致的连接collider失败
增加动态权限申请,应对flyme权限申请回归android原生机制
在已经上线的18款机型,全部点检了一遍,因为语音参数和连接安全认证更新的原因
v1.6.7
支持远程手机音视频的监听(camera source)
用getRealMetrics替换getMetrics获取实际分辨率,应对全面屏UI
通过信令通道传输remote device info
在demo保证keydown和keyup顺序, sdk为防止通道堵塞sendkey是多线程的,极端情况下keydown和up小于20ms的时候容易出现up先于down
兼容新发现codec issue
1.huawei hisilicon
2.vivo mtk phone ShangHai IT MTK
细分camera error
handle more camera fail situation
多于1个摄像头时,默认采用摄像头1, cameraid: 0 1 ...
混淆规则:keep整个webrtc的类
touch event time的千年虫问题修复, 开机时间长,event time用int会出现溢出
history: web js sdk
v1.0.0
实现浏览器客户端
实现webrtc建立连接,视频传输
实现鼠标事件监控传输给请求方
broswer客户端代码分层
重构js的接口api与函数回调和android java接口基本一致,增加客户端开发代码复用和减小工作量
v1.6.0
第二版js客户端
适应新的房间服务器/信令服务器逻辑
增加aes模块用于消息加密
与android端匹配控制命令
解决换行引起的sdp jason解析问题
解决同源策略问题
关键事件上报,onError,onPeerClosed
wss and https in js for collider for js客户端https访问公网服务器
心跳机制:js client add websockt heartbeat
合并,压缩target js, 40%~50% compression ratio, use plugins of grunt, please read README
查看原文: 实时音视频解决方案leningrad