如何在Android屏幕共享期间获取WebRTC中电话的内部声音

时间:2019-08-16 11:25:25

标签: android webrtc

我正在使用webrtc android。在这个项目中,我开发了“屏幕共享”功能,效果很好。但是我在屏幕共享期间有两个过滤器,用户可以使麦克风静音或使电话音频静音。当用户使麦克风静音时,接收方不收听发送方的语音;当用户使电话静音时,接收方仅侦听发送方音频,而不是电话音频,它正在工作,但我担心的是,当发送方使麦克风静音但允许电话音频时,则接收方必须接收电话音频,而不是发送方音频,例如当发送方共享屏幕并播放youtube视频时,接收方必须收听youtube音频,而不是发送方音频。如何获得实现此功能的方法。

我禁用了音轨,但接收器无法同时收听两种音频,这意味着我也尝试过AudioDeviceModule adm; adm.setMicrophoneMute(true);的电话音频和麦克风音频

1)最终AudioDeviceModule adm = createJavaAudioDevice();       adm.setMicrophoneMute(true);

2)AudioTrack localAudioTrack;    localAudioTrack.setEnabled(true);

我希望当我使麦克风静音时,接收器不收听发送方的语音;当我使电话音频静音时,接收器将不收听来自后台的任何音频;当我使麦克风静音并启用电话音频时,接收器必须收听背景音频即youtube或电话中的其他任何音频。但是我只能使用麦克风的静音功能。

1 个答案:

答案 0 :(得分:1)

  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();
    

    }