首页 关于 微信公众号
欢迎关注我的微信公众号

修改WebRTC源代码编译出我们需要的动态库(替换webrtc声音采集进行双向通话)

概述

在上一篇文章中,我们介绍了如何通过修改webrtc的源代码来实现单向的voip通话,那么在这篇文章中,我们将介绍如何修改webrtc的源代码来实现双向通话。

引入问题

Anywhere是一款视频直播软件。WebRTC是提供实时多媒体通信的第三方库。我们的最新需求是要能在 Anywhere 直播期间进行voip通话。

矛盾点分析

矛盾点分析在上一篇文章中就已经总结过了,我们在此不过多描述。

解决方法

我们知道,在上一篇文章中,我们是将webrtc的音频采集模块去掉,只播放另一端的音频,因此对方听不到我们这一端的声音。这不是真正意义上的voip通话,通话必须是双向的。所以我们为了解决能进行双向通话的问题,就自然想到能不能利用anywhere中的 Audio Queue采集到的音频信息替换掉webrtc采集的音频信息呢?答案是肯定的。 我们只需要查看一下webrtc源代码,找到webrtc采集的音频信息传递给了底层的哪个方法,哪个变量,然后我们就用Anywhere中的Audio queue替换掉webrtc的音频采集。这样就能完成webrtc的双向通话了。

在上层回调中的调用

Anywhere中的 Audio queue的call back中的调用:

	static void inputBufferHandler(void *                                 inUserData,
                               AudioQueueRef                          inAQ,
                               AudioQueueBufferRef                    inBuffer,
                               const AudioTimeStamp *                 inStartTime,
                               UInt32                                 inNumPackets,
                               const AudioStreamPacketDescription*	  inPacketDesc) {

    TVUWebRTCManager *webRTCManager = [TVUWebRTCManager shareInstance];
    if (webRTCManager) {
        if ([webRTCManager voipIsCalling]) {
            RTCPeerConnection *rtcPeerConn = [[TVUWebRTCManager shareInstance] getNewestPeerConnection];
            [rtcPeerConn acceptRecodedAudioData:(int8_t *)inBuffer->mAudioData size:inBuffer->mAudioDataByteSize];
        }
    }
  }

最终打的patch

最终打的patch文件存储在我的码云(ModifyWebRTC/double_talk)

Blog

Opinion

Project