android - android屏幕共享时如何在webrtc中获取手机内部声音

标签 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. 通过AudioPlayback捕获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();
    

    }

关于android - android屏幕共享时如何在webrtc中获取手机内部声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57523812/

相关文章:

android自定义相机拉伸(stretch)surfaceview

java - 拖放益智游戏的碰撞问题

java - 找不到类 'twitter4j.http.AccessToken'

ios - 如何将视频渲染器添加到本地视频轨道

android - 在谷歌地图上绘制心形多边形

java - Android 上 AKKA(最好是 2.4)的 JAR 文件(编译的 java 版本 1.6 - 不是 1.8)

ssl - 使用 webrtc 和 wowza 发布直播流

reactjs - 离开 React 组件时网络摄像头不会关闭

javascript - Youtube/Facebook 直播如何从网络浏览器工作

ios - 无法在 WebRTC 上设置 session 描述