我是靠谱客的博主 无心哑铃,最近开发中收集的这篇文章主要介绍WebRTC 源码分析1.WebRTC的数据流2 WebRTC线程模型3 WebRTC网络传输WebRTC音频采集WebRTC视频采集音频编码WebRTC创建编码器并进行视频编码,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1.WebRTC的数据流

如果视频数据帧率过多,则要将多余的帧丢掉。出来后的视频帧除了交给编码器编码外,还需要发送给本地渲染模块一份以进行本地预览。
对音频来说,最主要的是进行3A处理。AEC(回波抵消)ANS(背景噪声抑制)AGC(自动增益控制)
音频默认编码器是opus.
视频默认VP8, 支持VP8,VP9,H264

 

//以伪代码的方式进行逻辑梳理。
socketpacket=recvfromNt();
if(socketpacket==RTP)
{
    
    if(socket.codec==FEC)
    {
        newpacket=Fec.decode(socketpacket)
    }
    else
    {
        newpacket=decodepacket(sockepacket)
    }
    if(newpacket.attr=audio)
    {
        NetEQ.pushBack(newpacket);
    }
    if(newpacket.attr=video)
    {
        Jittbuffer.pushBack(newpacket);
    }   
 }
 if(socketpacket==RTCP)
 {
    //do something 
 }
 
 
 /*
 NetEQ 对音频数据进行平滑处理,消除抖动,然后进行音频解码,最后根据音频时间戳对音频进行同步处理。
 音频同步的处理规则:如果音频包没有丢包、抖动等问题,则正常解码播放音频;
 如果音频数据由堆积,则加速播放;
 如果音频数据不足,则采用变速不变调的方法将语音拉长。
 */
 

2 WebRTC线程模型

3 WebRTC网络传输

如何让通信的双方彼此知道对方的IP地址,开放的端口以及使用的网络协议类型?
1.各自收集自己可用的Candidate;
2.将收集好的Candidate通过信令交换给对方,之后双方就可以建立连接互发数据了。

如何检测Socket所对应的地址是否有外网映射?
向用户指定的STUN服务器发送Stun Binding Request消息,如果收到STUN服务器的Stun Binding Response的消息说明该该地址有外网映射。

WebRTC中建立网络连接的方法?
1.在收集Candidate并返回给应用层的过程中,如果已经收到RemoteCandidate,则会创建Connection对象,
2.应用层收到远端传来的Candidate并调用AddIceCandidate()方法,将其加入PeerConnection对象,会创建新的Connection.
3.WebRTC收到STUN服务器响应消息,如果对应的Connection还没有创建,那么此时会为其创建Connection.因为通信的双方存在多个可用的Connection,且每个Connection有优越之分。创建好Connection之后,还要对其进行排序和Ping测试(ping,STUN协议中的BindingRequest 和Binding Response实现Ping功能。

什么时候会用到第三种连接方式?
通常是在某一段使用第二种方式创建连接以后,做ping测试,者时另一端就会收到binding request,此时使用第三种方式在自己的一段将连接建立起来。

WebRTC音频采集

WebRTC在设备层上定义了一套统一接口,这样上层业务只要调用这套接口就可以采集音视频数据。
当WebRTC进行媒体协商时,它会调用ADM启动两个线程,一个用于设备采集音频数据,另一个用于播放音频数据。

音频采集流程:驱动设备按照采样参数(采样率、采样大小、通道数)设定的要求采集音频数据,每采集到一帧数据,就交由AudioDeviceBuffer处理。AudioDeviceBuffer在收到数据后,首先暂存起来,然后调用音频引擎对数据进行重采样,使其变成标准规格后做前处理(3A算法),处理后的音频帧就可以进行编码了。音频帧的回音消除、降噪等工作是由硬件完成的。AP(audio process)不在对其做同样的工作。

音频播放流程:
windows:音频播放流程也需要一个单独的县城,该线程会以阻塞方式向声卡的缓冲区填充数据。数据填好后,声卡会自动从缓冲区读取数据进行播放。播放线程一旦将数据填充成功,便立即向AudioDeviceBuffer要数据,AudioDeviceBuffer转而向音频引擎要数据,层层推进。解码线程拿到数据后,播放线程并不会直接使用,它会使用混音器将同一时刻多个通道的音频进行混音,在经过AP处理。
ios采用事件驱动的方式。

WebRTC视频采集

音频编码

音频编码器的管理

音频编码器何时创建的?
媒体协商之后,就可以确认双方使用的音视频编解码器。

音频解码
何时创建的音频解码器?
远端数据过来后才创建的。

WebRTC创建编码器并进行视频编码

最后

以上就是无心哑铃为你收集整理的WebRTC 源码分析1.WebRTC的数据流2 WebRTC线程模型3 WebRTC网络传输WebRTC音频采集WebRTC视频采集音频编码WebRTC创建编码器并进行视频编码的全部内容,希望文章能够帮你解决WebRTC 源码分析1.WebRTC的数据流2 WebRTC线程模型3 WebRTC网络传输WebRTC音频采集WebRTC视频采集音频编码WebRTC创建编码器并进行视频编码所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部