概述
该文档主要介绍webrtc移动端sdk代码关于音频远程调用导出修改。描述框架基础代码架构,由于涉及到webrtc原生的native封装性,这里需要在native层修改代码导出音频数据。
一、webrtc端上代码实现结构
按照使用功能分为3层:接口层,提供基本的peerconnetion 接口功能;控制层,主要是SDP 的解析和生成工作;传输层,提供媒体打包,传输,流控,安全,ICE 等功能。
1,接口层
PeerConnectionInterface 其实现类是PeerConnection提供webrtc对外提供的服务能力
2、控制层
所谓的控制层就是sdp模块层: sdp模块,包括编解码参数,流控方式,Dtls 加解密参数以及ICE穿透用的地址候选。
3、传输层
视频传输包括:媒体打包(RTP/RTCP),数据安全(DtlsTransport),Ice P2P 传输模块(IceTransport)
二、涉及到基础类
webrtc控制层是基本的关系类图表
整理的基本关系
三、sdk音频导出
如上图所示基础类自定义C接口AudioRendSink,添加音频导出类及实现。在AudioTrackInterface,实现类AudioTrack中添加AudioRendSink。这样就可以导出音频数据。
1、ios实现
(1) sdk中业务调用层。音视频添加及删除方法添加:
RTCAudioTrack.h
/** Register a renderer that will render all frames received on this track. */
- (void)addRenderer:(id)renderer;
/** Deregister a renderer. */
- (void)removeRenderer:(id)renderer;
(2)sdk中mm调用AudioRendSink实现ios层和层代码切换调用
namespacewebrtc {
class AudioRenderAdapter //:public AudioSinkInterface{
:publicwebrtc::AudioTrackSinkInterface {
public:
AudioRenderAdapter(RTCAudioRenderAdapter* adapter) {
adapter_= adapter;
}
~AudioRenderAdapter(){ }
voidOnData(constvoid* audio_data,
intbits_per_sample,
intsample_rate,
size_tnumber_of_channels,
size_tnumber_of_frames){
[adapter_.audioRender onAudioFrame:audio_data len:(number_of_frames*number_of_channels*bits_per_sample/2) bitsPerSample:bits_per_sample sampleRate:sample_rate channale:number_of_channels];
}
private:
__weak RTCAudioRenderAdapter *adapter_;
};
}
@implementationRTCAudioRenderAdapter {
std::unique_ptr<webrtc::AudioRenderAdapter> _adapter;
}
@synthesizeaudioRender = _audioRender;
- (instancetype)initWithNativeRenderer:(id)audioRender {
NSParameterAssert(audioRender);
if(self= [superinit]) {
_audioRender = audioRender;
_adapter.reset(newwebrtc::AudioRenderAdapter(self));
}
return self;
}
- (webrtc::AudioTrackSinkInterface *)nativeAudioRenderer {
return_adapter.get();
}
(2) Android版本实现,
原理一样
具体代码实现,改的不多,如有需要,请留言。