iOS WebRTC RTCMediaStreamTrack静音取消静音远程音频轨道

时间:2020-01-25 04:01:05

标签: ios webrtc webrtc-ios

我正在使用latest本机iOS GoogleWebRTC pod版本1.1.29400

我正在尝试按WebRTC规范here中的要求禁用/启用音频轨道。在目标c中,根据我的理解,我们将其称为isEnabled设置器:

RTCMediaStreamTrack *track = self.localTracks[trackId];
track.isEnabled = YES/NO;

在iOS 13.1.3上的我的应用中,这对远程音频流没有影响。它继续播放。

这是我基于多个示例的理解:

我在the official WebRTC iOS example中找不到他们在isEnabled上叫RTCMediaStreamTrack的任何地方。

但是,我确实看到它们从视图控制器here调用RTCAudioSession.isAudioEnabled。但是,当我构建该应用程序并弄乱RTCAudioSession时,将isAudioEnabled设置为false会使麦克风输入和扬声器输出静音。我只想在保持麦克风高温的同时禁用扬声器输出。

任何指导或技巧将不胜感激:)

2 个答案:

答案 0 :(得分:1)

他们在WebRTC M80 Release Notes中声明他们将淘汰移动图书馆。

要了解本机移动库(iOS和Android)的最新错误修正和功能,我们需要build from source

在使用从源代码构建的WebRTC.framework构建AppRTCMobile示例应用程序之后,我进行了一些更改并确认我能够按需静音远程音轨。

ARDAppClient.h中,我为远程RTCMediaStream添加了一个 strong 指针引用和一个用于切换流静音的方法头:

@property(nonatomic, strong) RTCMediaStream *remoteAudioStream;
// ...
- (void)setRemoteAudioEnabled:(BOOL)enabled;

ARDAppClient.m部分的RTCPeerConnectionDelegate中,我收听didAddStream委托并保存对远程流的引用:

- (void)peerConnection:(RTCPeerConnection *)peerConnection
          didAddStream:(RTCMediaStream *)stream {
  RTCLog(@"Stream with %lu video tracks and %lu audio tracks was added.",
         (unsigned long)stream.videoTracks.count,
         (unsigned long)stream.audioTracks.count);
  _remoteAudioStream = stream;
}

ARDAppClient.m中,我还添加了一个用于静音/取消静音流的函数,现在我们对其进行引用:

- (void)setRemoteAudioEnabled:(BOOL)enabled {
  if (_state == kARDAppClientStateDisconnected) {
    return;
  }
  RTCLog(@"Setting remote stream to be %s", enabled ? "Enabled" : "Not Enabled");
  RTCLog(@"Number of remote audio tracks = %lu", (unsigned long)_remoteAudioStream.audioTracks.count);
  if (_remoteAudioStream.audioTracks.count == 0) {
    RTCLog(@"ERROR no audio tracks to disable!");
    return;
  }
  _remoteAudioTrack = _remoteAudioStream.audioTracks[0];
  [_remoteAudioTrack setIsEnabled:enabled];
}

最后,在ARDVideoCallViewController.m中,我将覆盖切换摄像头按钮以切换远程音轨静音:

- (void)videoCallViewDidSwitchCamera:(ARDVideoCallView *)view {
  // [_captureController switchCamera];
  self.audioEnabled = !self.audioEnabled;
  [_client setRemoteAudioEnabled:self.audioEnabled];
}

答案 1 :(得分:0)

我在 Android 中遇到过类似的问题。 由于适用于 iOS 和 Android 的 Webrtc SDK 非常相似,您可以使用 AudioTrack.setVolume(0.0) 静音和 AudioTrack.setVolume({value more than zero}) 取消静音远程音轨。 但是 isEnabled 属性由于某种原因没有静音/取消静音。