Android端WebRTC音视频通话录音-获取音频输出数据
做过WebRTC的音视频通话应该知道WebRTC的sdk只暴露了麦克风输入数据和视频数据,如果要实现音视频录制该怎么办呢?当然可以在通话的各个终端分别进行录制,然后上传服务器进行处理。那如果想在一个设备上进行统一录制呢?通话对方的音频数据该如何获取?
WebRTC是在哪输出音频数据的?
在网上搜索了一圈都说要改源码,WebRTC源码10几个g,还在墙外,编译也有难度,那如何跨过这一步呢?
这一步我们就要去找找源码了。
JavaAudioDeviceModule
在创建PeerConnectionFactory时要传入JavaAudioDeviceModule,即使不传,也会帮我们创建一个默认的。看这个就是用来操作音频相关的。
gradle下载的源码是没有注释的,可以去网上找找
可以看到AudioRecord作为音频输入,AudioTrack作为音频输出。
因为可以拿到输入的数据,暂时先不管,先去看看AudioTrack。
WebRtcAudioTrack
查找一圈之后找到了WebRtcAudioTrack,再进去看看。
坑,这个类竟然不是public…,算了,这是源码,也没辙。
既然找到了AudioTrack,再找找AudioTrack.write()方法是在那调用的。
在AudioTrackThread.writeBytes()方法中,
到这里就大概了解AudioTrackThread是用来读取播放数据,然后write到AudioTrack中。到这里,就找到了我们想要的数据,那该如何取出来呢?
获取write到AudioTrack的数据
首先要确定的是WebRtcAudioTrack这个类仅包可见,所以要创建一个相同的包才能读取到。
AudioTrackThread也是private,所以能操作的只有AudioTrack,要用到反射,来个狸猫换太子,把WebRtcAudioTrack中的audioTrack,替换成自己自定义的,然后从 write() 回调出数据即可。
自定义类继承AudioTrack
首先要自定义一个类,继承AudioTrack
package org.webrtc.audio
class AudioTrackInterceptor constructor(
/**
* 即:原[WebRtcAudioTrack.audioTrack]
*/
private var originalTrack: AudioTrack,
/**
* 音频数据输出回调
*/
private var samplesReadyCallback: JavaAudioDeviceModule.SamplesReadyCallback
) : AudioTrack(//不用关心这里传的参数,只是一个壳
AudioManager.STREAM_VOICE_CALL,
44100,
AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT,
8192,
MODE_STREAM
) {
}
自定义类其实就是一个空壳,不用关心构造方法中传的参数
这里有两个传参,一个是原WebRtcAudioTrack.audioTrack,另外一个就是数据回调,基本的思想就是要把原WebRtcAudioTrack.audioTrack调用的相关方法要重写一遍,然后使用originalTrack重新调用一遍即可,比如这样:
...
override fun getState(): Int {
return originalTrack.state
}
override fun play() {
originalTrack.play(