iPhone X 和 iPhone 8 的 WebRTC 视频出现噪点问题

4
我有一个iOS WebRTC应用程序(带有EasyRTC包装器)。直到iPhone X发布之前,它与所有iOS设备都能正常运行。
问题在于来自iPhone X的视频在其他设备上看起来像这样:iphoneX broken video iPhone X中的哪些更改导致了这种伪影?如何解决?
使用以下代码启动视频:
@implementation WebRTCModule (RTCMediaStream)

- (RTCMediaConstraints *)defaultMediaStreamConstraints {
    NSDictionary *mandatoryConstraints
            = @{ kRTCMediaConstraintsMinWidth     : @"1280",
                 kRTCMediaConstraintsMinHeight    : @"720",
                 kRTCMediaConstraintsMinFrameRate : @"30" };
    RTCMediaConstraints* constraints =
    [[RTCMediaConstraints alloc] initWithMandatoryConstraints:mandatoryConstraints optionalConstraints:nil];
    return constraints;
}
typedef void (^NavigatorUserMediaErrorCallback)(NSString *errorType, NSString *errorMessage);
typedef void (^NavigatorUserMediaSuccessCallback)(RTCMediaStream *mediaStream);

- (void)getUserVideo:(NSDictionary *)constraints
    successCallback:(NavigatorUserMediaSuccessCallback)successCallback
      errorCallback:(NavigatorUserMediaErrorCallback)errorCallback
        mediaStream:(RTCMediaStream *)mediaStream {
    id videoConstraints = constraints[@"video"];
    AVCaptureDevice *videoDevice;
    if ([videoConstraints isKindOfClass:[NSDictionary class]]) {
        for (AVCaptureDevice *aVideoDevice in [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]) {
            if (aVideoDevice.position == AVCaptureDevicePositionFront) {
                videoDevice = aVideoDevice;
                break;
            }
        }
        if (!videoDevice) {
            videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
        }
    }
    if (videoDevice) {
        RTCMediaConstraints* constraints = [self defaultMediaStreamConstraints];
        RTCAVFoundationVideoSource *videoSource = [self.peerConnectionFactory avFoundationVideoSourceWithConstraints:constraints];

        dispatch_queue_t backgroundQueue = dispatch_queue_create("com.app.videoquality", 0);
        dispatch_async(backgroundQueue, ^{
            videoSource.captureSession.sessionPreset = AVCaptureSessionPresetHigh;
            switch (videoDevice.position) {
                case AVCaptureDevicePositionBack:
                    if (videoSource.canUseBackCamera) {
                        videoSource.useBackCamera = YES;
                    }
                break;
                    case AVCaptureDevicePositionFront:
                    videoSource.useBackCamera = NO;
                break;
            }
            NSString *trackUUID = [[NSUUID UUID] UUIDString];
            RTCVideoTrack *videoTrack = [self.peerConnectionFactory videoTrackWithSource:videoSource trackId:trackUUID];
            [mediaStream addVideoTrack:videoTrack];

            dispatch_async(dispatch_get_main_queue(), ^{
                successCallback(mediaStream);
            });
        });
    } else {
        errorCallback(@"OverconstrainedError", /* errorMessage */ nil);
    }
}
@end

我的猜测是sessionPreset = AVCaptureSessionPresetHigh在iPhone X上不像应该的那样工作。但不幸的是,我目前无法检查它。


更新。

从iPhone 8传输视频时观察到相同的行为。但在安装了iOS 11.2.1的iPhone 7上一切正常。


更新2

我已禁用设置质量的自定义代码,但问题仍然存在。


更新3

这发生在WebRTC版本58上。

3个回答

3
我通过在iPhone X侧创建视频源后设置以下代码解决了相同的问题。
VideoSource.adaptOutputFormat(toWidth: 1280, height: 720, fps: 30);
VideoSource.captureSession.canSetSessionPreset(AVCaptureSessionPreset1280x720);

我没有两个iPhone X来测试这段代码中的测试用例。

1
你的第二行代码没有副作用,而且你还要丢弃结果。只需要使用 adaptOutputFormat 就可以了。 - Teivaz

0

在将WebRTC更新到版本65后,此问题不再出现。我无法确定根本原因。

尽管前置摄像头的特性保持不变(iPhone 7为1080p @ 30fps,iPhone X为1080p @ 30fps),但似乎@Mung Bean提出的解决方案实际上可能有效。


0

我有同样的问题。似乎 iPhoneX 的活动格式对其他设备来说太过于强大。解决方法是设置一些较低的相机格式:

cameraVideoCapturer = RTCCameraVideoCapturer(delegate: videoSource)
if let camera = RTCCameraVideoCapturer.captureDevices().filter({ $0.position == cameraPosition }).first {
   cameraVideoCapturer.startCapture(with: camera, format: camera.formats.first!, fps: 30)
}

这里我设置了第一个格式,它是最低的,仅用于说明,但任何1280x720的格式都可以胜任。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接