webrtc远端音频回调导出

2019-08-25  本文已影响0人  大飞_2048

概述

        该文档主要介绍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控制层是基本的关系类图表

整理的基本关系

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版本实现,

       原理一样

具体代码实现,改的不多,如有需要,请留言。

上一篇下一篇

猜你喜欢

热点阅读