Android端WebRTC音视频通话录音-获取音频输出数据

本文介绍了如何通过自定义AudioTrack并利用反射技术,实现在Android端WebRTC音视频通话中获取音频输出数据,即对方的音频流。通过创建一个AudioTrackInterceptor类,替换WebRtcAudioTrack中的AudioTrack,并在write()方法中回调数据,从而实现录音功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

做过WebRTC的音视频通话应该知道WebRTC的sdk只暴露了麦克风输入数据和视频数据,如果要实现音视频录制该怎么办呢?当然可以在通话的各个终端分别进行录制,然后上传服务器进行处理。那如果想在一个设备上进行统一录制呢?通话对方的音频数据该如何获取?

WebRTC是在哪输出音频数据的?

在网上搜索了一圈都说要改源码,WebRTC源码10几个g,还在墙外,编译也有难度,那如何跨过这一步呢?
这一步我们就要去找找源码了。

JavaAudioDeviceModule

在创建PeerConnectionFactory时要传入JavaAudioDeviceModule,即使不传,也会帮我们创建一个默认的。看这个就是用来操作音频相关的。
在这里插入图片描述
gradle下载的源码是没有注释的,可以去网上找找

可以看到AudioRecord作为音频输入,AudioTrack作为音频输出。
因为可以拿到输入的数据,暂时先不管,先去看看AudioTrack。

WebRtcAudioTrack

![在这里插入图片描述](https://img-blog.csdnimg.cn/7ca3226291e444a59147c08ac7bc2c63.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NzZG5fc2hlbjAyMjE=,size_16,color_FFFFFF,t_70

查找一圈之后找到了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(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冬季穿短裤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值