RTCVideoCapturer capturerWithDeviceName :( NSString *)在后续调用后变得非常慢

时间:2014-09-29 08:52:15

标签: ios objective-c ios7 ios8 webrtc

我正在构建基于webrtc的{​​{1}}应用。我在每次打电话之前都会调用以下代码:

voip

在通话结束后,我重置所有这些变量(大多只是将它们设置为零)。我已经看到这种方法非常有效,但最近有一个漏洞潜入其中。每次后续调用都会增加此行的执行时间

NSMutableArray *m = [[NSMutableArray alloc] init];
NSMutableArray *o = [[NSMutableArray alloc] init];

//[m addObject:[[RTCPair alloc] initWithKey:@"maxFrameRate" value:@"30"]];
//[m addObject:[[RTCPair alloc] initWithKey:@"maxFrameRate" value:@"24"]];
//[m addObject:[[RTCPair alloc] initWithKey:@"maxHeight" value:@"180"]];
NSString* cameraID = nil;
for (AVCaptureDevice *captureDevice in [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]) {
    if (captureDevice.position == AVCaptureDevicePositionFront) {
        cameraID = [captureDevice localizedName];
        break;
    }
}

capturer = [RTCVideoCapturer capturerWithDeviceName:cameraID]; //why so slow :(

RTCMediaConstraints *videoConstraints = [[RTCMediaConstraints alloc] initWithMandatoryConstraints:m optionalConstraints:o];
videoSource = [peerConnectionFactory videoSourceWithCapturer:capturer constraints:videoConstraints];

localVideoTrack = [peerConnectionFactory videoTrackWithID:@"ARDAMSv0" source:videoSource];

lms = [peerConnectionFactory mediaStreamWithLabel:@"ARDAMS"];

if (localVideoTrack) [lms addVideoTrack:localVideoTrack];
[lms addAudioTrack:[peerConnectionFactory audioTrackWithID:@"ARDAMSa0"]];

[peerConnection addStream:lms constraints:[[RTCMediaConstraints alloc] init]];

dispatch_async(dispatch_get_main_queue(), ^{
    [callViewController setLocalVideo];
});

我尝试在应用程序启动时只设置一次捕获器,但随后应用程序崩溃

capturer = [RTCVideoCapturer capturerWithDeviceName:cameraID];

即使所有参数都已初始化(我使用调试器检查)。

有没有人知道这可能是什么?我确信这个相同的代码之前完美无缺。我没有更新videoSource = [peerConnectionFactory videoSourceWithCapturer:capturer constraints:videoConstraints]; 库,webrtcxcode

1 个答案:

答案 0 :(得分:1)

你走在正确的轨道上!

您需要做的不仅是在开头创建捕获器,还要创建videosource,localvideotrack,localaudiostream和RTCMediaStream对象。创建localvideotrack和localaudiostream后,将em添加到可用类范围的RTCMediaStream对象。然后,当您想要开始对话时,您需要做的就是重新使用您在开始时创建的RTCMediaStream对象,方法是将其添加到新的对等连接中!请务必在对话完成后终止对等连接对象。那时不需要对RTCMediaStream对象进行任何操作。

事情变得如此缓慢的原因在于,每次创建新的捕获器时,它都不会适当地杀死可能已经存在的任何先前实例。