我正在使用webrtc android。在这个项目中,我开发了“屏幕共享”功能,效果很好。但是我在屏幕共享期间有两个过滤器,用户可以使麦克风静音或使电话音频静音。当用户使麦克风静音时,接收方不收听发送方的语音;当用户使电话静音时,接收方仅侦听发送方音频,而不是电话音频,它正在工作,但我担心的是,当发送方使麦克风静音但允许电话音频时,则接收方必须接收电话音频,而不是发送方音频,例如当发送方共享屏幕并播放youtube视频时,接收方必须收听youtube音频,而不是发送方音频。如何获得实现此功能的方法。
我禁用了音轨,但接收器无法同时收听两种音频,这意味着我也尝试过AudioDeviceModule adm; adm.setMicrophoneMute(true);
的电话音频和麦克风音频
1)最终AudioDeviceModule adm = createJavaAudioDevice(); adm.setMicrophoneMute(true);
2)AudioTrack localAudioTrack; localAudioTrack.setEnabled(true);
我希望当我使麦克风静音时,接收器不收听发送方的语音;当我使电话音频静音时,接收器将不收听来自后台的任何音频;当我使麦克风静音并启用电话音频时,接收器必须收听背景音频即youtube或电话中的其他任何音频。但是我只能使用麦克风的静音功能。
答案 0 :(得分:1)
可以通过AudioPlayback capture API实现共享系统音频 适用于 android 10 及更高版本 Click here for more detailed implementation
在 WebRtcAudioRecord 类中,创建一个音频记录对象 AudioPlaybackCaptureConfiguration,添加切换音频的方法 普通音频记录和 AudioPlaybackCapture 之间的记录对象 录音带。我们将一次只能共享一个音频资源,麦克风或系统音频,而不是一次共享
public void switchAudioTrack(MediaProjection mediaProjection) {
if(mediaProjection!=null) {
final int channelConfig = channelCountToConfiguration(channels);
int minBufferSize = AudioRecord.getMinBufferSize(samplerate, channelConfig, audioFormat);
int bufferSizeInBytes = Math.max(BUFFER_SIZE_FACTOR * minBufferSize, byteBuffer.capacity());
AudioRecord screenShareAudioRecord = createAudioRecordOnMOrHigher(audioSource, samplerate, channelConfig, audioFormat, bufferSizeInBytes, mediaProjection);
stopRecording();
audioRecord = screenShareAudioRecord;
startRecording();
}else{
stopRecording();
initRecording(samplerate,channels);
startRecording();
}
}
private static AudioRecord createAudioRecordOnMOrHigher(
int audioSource, int sampleRate, int channelConfig, int audioFormat, int bufferSizeInBytes,MediaProjection mediaProjection) {
if(mediaProjection!=null){
AudioPlaybackCaptureConfiguration config = new AudioPlaybackCaptureConfiguration
.Builder(mediaProjection)
.addMatchingUsage(AudioAttributes.USAGE_MEDIA)
.build();
return new AudioRecord.Builder()
.setAudioPlaybackCaptureConfig(config)
.setAudioFormat(new AudioFormat.Builder()
.setEncoding(audioFormat)
.setSampleRate(sampleRate)
.setChannelMask(channelConfig)
.build())
.setBufferSizeInBytes(bufferSizeInBytes)
.build();
}
return new AudioRecord.Builder()
.setAudioSource(audioSource)
.setAudioFormat(new AudioFormat.Builder()
.setEncoding(audioFormat)
.setSampleRate(sampleRate)
.setChannelMask(channelConfig)
.build())
.setBufferSizeInBytes(bufferSizeInBytes)
.build();
}