我正在构建基于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];
库,webrtc
或xcode
。
答案 0 :(得分:1)
你走在正确的轨道上!
您需要做的不仅是在开头创建捕获器,还要创建videosource,localvideotrack,localaudiostream和RTCMediaStream对象。创建localvideotrack和localaudiostream后,将em添加到可用类范围的RTCMediaStream对象。然后,当您想要开始对话时,您需要做的就是重新使用您在开始时创建的RTCMediaStream对象,方法是将其添加到新的对等连接中!请务必在对话完成后终止对等连接对象。那时不需要对RTCMediaStream对象进行任何操作。
事情变得如此缓慢的原因在于,每次创建新的捕获器时,它都不会适当地杀死可能已经存在的任何先前实例。