WebRTC-Android改变音频输入源

前言

该文章面向对WebRTC有一定基础的码农,如果完全没了解过WebRTC的朋友,可以点赞并私信我进行一对一辅导哦。
因为项目需要直播功能,所以用到了WebRTC,但是由于项目本身有一个特殊功能需要一直使用麦克风,而此时直播无法传输声音。经过一番定位后,应该是该特殊功能在底层直接占用了声卡的驱动,导致WebRTC去实例化AudioRecord时卡住,具体卡住的位置是:

public AudioRecord(AudioAttributes attributes, AudioFormat format, int bufferSizeInBytes, int sessionId) throws IllegalArgumentException {
   
    ......
 
    int initResult = native_setup( new WeakReference<AudioRecord>(this),
        mAudioAttributes, sampleRate, mChannelMask, mChannelIndexMask,
        mAudioFormat, mNativeBufferSizeInBytes,
        session, ActivityThread.currentOpPackageName(), 0 /*nativeRecordInJavaObj*/);
 
    ......
}

因此如果要该特殊功能和直播都能正常使用,就需要改变WebRTC的音频输入源为从特殊功能获取到的音频PCM裸流。

思路

既然要改变音频输入源,那么首先找一下WebRTC有没有相关接口,找了一圈发现没有,无奈只能继续深挖WebRTC究竟是在哪里采集音频数据。

最终找到了org.webrtc.audio.WebRtcAudioRecord.java这个类(具体的音频采集流程参考:https://blog.piasy.com/2018/09/14/WebRTC-ADM/index.html#%E9%9F%B3%E9%A2%91%E9%87%87%E9%9B%86)。

大致流程就是:

  1. 创建AudioRecord实例
  2. 创建ByteBuffer实例并且native层缓存ByteBuffer的地址
  3. 开启采集线程
  4. 在采集线程中不断读取AudioRecord的数据到ByteBuffer中,再把ByteBuffer的数据传递给native层

到这里,思路就明确了,关键核心就是在这个ByteBuffer,要改变音频输入源,只需要把音频数据填充到这个ByteBuffer就可以了。

流程

既然找到了思路,那么我们就开始对WebRTC的SDK进行改造,首先目前要修改的目标已经很明确了,就是org.webrtc.audio.WebRtcAudioRecord.java这个类,那么首先就聊聊要怎么把这个类替换成自己的代码&#x

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值