首页 > 解决方案 > iOS WebRTC RTCMediaStreamTrack 静音取消静音远程音轨

问题描述

我正在使用最新的原生 iOS GoogleWebRTC pod 版本 1.1.29400

我正在尝试按照此处的 WebRTC 规范中的规定按需禁用/启用音轨。在目标 c 中,我的理解是我们称之为isEnabledsetter:

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

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

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

我在官方 WebRTC iOS 示例中找不到他们调用isEnabled.RTCMediaStreamTrack

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

任何指导或提示将不胜感激:)

标签: ioswebrtcwebrtc-ios

解决方案


WebRTC M80 发行说明中,他们声明他们将弃用移动库。

为了及时了解本地移动库(iOS 和 Android)的最新错误修复和功能,我们需要从源代码构建

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

在我为遥控器ARDAppClient.h添加一个RTCMediaStream指针引用和一个用于切换流静音的方法头:

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

ARDAppClient.mRTCPeerConnectionDelegate部分中,我听取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];
}

推荐阅读