总结一下自己写音视频遇到的坑

1. 媒体约束设置 

  • audio 和Video 权限获取

  • 添加 videoSource audioSource  

  • 添加 audioTrack 和videoTrack

  • 设置 captureSession

  • 设置 video的 format device  fps

手机向下适配的话最好设置 AVCaptureSessionPreset640x480 fps 设置15  , 一般的设置的是AVCaptureSessionPreset1280x720甚至更高.

 这里的坑点是数值会影响视频的分辨率清晰度包括共享屏幕也会拉伸,放大所有也会拉伸,我们自己的处理是resolution rate大小他适配设置哪一个数值  

注意的是这里 这个很重要,你的黑屏有可能就是这里导致的

屏幕的填充方式

2. 前后置摄像头切换

  • CGAffineTransformMakeScale(-1.0,1.0)设置前后摄像头切换

  • AVCaptureDevicePositionFront  | AVCaptureDevicePositionBack

3. 切换听筒(receiver, earpiece)与扬声器(speaker)

4. 关闭所有远端音频

5. 关闭某一个音频

6.编码和解码 

  • 硬编码 优点: CPU消耗极低,解码效率极高 缺点: 要使用私有接口VideoToolBox
  • 软编码 : 缺点: 消耗CPU太大  比如iPhone4 -6 基本手机烫的要爆炸有时候会卡死 

硬编码:  不使用CPU进行编码,使用显卡(GPU)进行硬件加速,专用的DSP、FPGA、ASIC芯片等硬件进行编码(IOS  AudioToolbox  | Video ToolBox)

软编码: 使用CPU进行编码。编码框架ffmpeg+x264

由于手机发烫不得不进行硬编码和解码,如果技术比较厉害也可以H265最好他的优点如下:

  • 压缩比高,在相同图片质量情况下,比JPEG高两倍
  • 能增加如图片的深度信息,透明通道等辅助图片。
  • 支持存放多张图片,类似相册和集合。(实现多重曝光的效果)
  • 支持多张图片实现GIF和livePhoto的动画效果。
  • 无类似JPEG的最大像素限制
  • 支持透明像素
  • 分块加载机制
  • 支持缩略图

H264Decode

H264Encode

建议用硬编码 否则手机会烫的吓人哈哈.

7 PeerConnection:

offer Anwer ICE  DTLS STUN TURN 

DTLS:

8 拉流和推流(操作UI要放在主线程操作)

9 判断是否有摄像头在取否则你会崩溃 摄像头有可能对方是没有的比如PC端

  •  共享画面拉流和推流 共享画面后台运行 远端点击网页和其他APP影响

  • 视频录制

  • socket连接 重连 

  • socket 保活

  • 共享释放不掉的问题

  • 共享远端屏幕拉伸 iPad  iOS端 PC 端 适配

  • VOIP PushKit 

  • UserNotifications

回声消除 

用到的库主要是AEC (c ,c++)要混编 

WebRTC的AEC算法主要包括以下几个重要的模块:

  1. 回声延迟估计模块

  2. NLMS算法

  3. NLP非线性滤波

  4. CNG(comfort nosie generation)

  5. 回声延迟估计 回声延迟长短对回声抵消器的性能有较大影响,过长的的滤波器抽头会带来较大的延迟,并且语音信号是短时平稳信号,过长的滤波器抽头也不适合短时平稳信号特征。 基于相关的延迟算法。该算法的主要思想是: 设1表示有说话音,0表无说话声(或者很弱的说话声),参考端(远端)信号和接收端信号可能的组合方式如下: webrtc默认(1, 0)和(0,1)是不可能发生的。设在时间间隔p上,即,频带q,,输入信号加窗后的功率谱用表示,其角标表示其加了窗函数。对每个频带的功率谱设定一个门限

如果, 则; 如果, 则; 同理,对于信号,加窗信号功率谱和门限如果, 则; 如果, 则; 考虑到实际处理的方便,在webrtc的c代码中,将经过fft变换后的频域功率谱分为32个子带,这样每个特定子带的值可以用1个比特来表示,总共需要32个比特,只用一个32位数据类型就可以表示。

  • NLMS归一化最小均放只适应算法 见前一章

  • NLP(非线性滤波) webrtc采用了维纳滤波器,此处只给出传递函数的表达式,设估计的语音信号的功率谱为, 噪声的功率谱为, 则滤波器的传递函数为

  • 对于webRTC的AEC需要注意两点:

  • 延迟要小,因为算法默认滤波器长度是分为12块,每块64点,按照8000采样率,也就是12×8ms=96ms的数据,超过这个长度就处理不了了。

  • 延迟抖动要小,因为算法是默认10块也计算一次参考数据的位置(即滤波器能量最大的那一块),所以如果抖动很大的话,找参考数据不准确的,这样回声就消除不掉了

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享