RTCVideoCapturer capturerWithDeviceName:(NSString *)在后续调用后变得非常缓慢
问题描述:
我在构建一个基于的voip
应用程序。我把下面的代码之前每个调用我做:通话结束后我重置所有这些变量RTCVideoCapturer capturerWithDeviceName:(NSString *)在后续调用后变得非常缓慢
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];
});
后(大多只是将它们设置为无)。我已经看到这种方法工作得很好,但最近有一个bug潜入其中。每个后续的调用会增加该行
capturer = [RTCVideoCapturer capturerWithDeviceName:cameraID];
我试图在应用的开始设置获取部只有一次的执行时间,但随后在
videoSource = [peerConnectionFactory videoSourceWithCapturer:capturer constraints:videoConstraints];
应用程序崩溃,即使所有参数进行初始化(我使用调试器进行检查)。
有没有人知道这可能是什么?我敢肯定,这个相同的代码之前工作完美。我没有更新webrtc
库,xcode
或iOS
。
答
您正确的方向!
您需要做的不是在开始时创建捕获器,而是创建视频源,localvideotrack,localaudiostream和RTCMediaStream对象。一旦创建localvideotrack和localaudiostream,将em添加到可用于类的RTCMediaStream对象。然后,当你想开始一个对话时,你需要做的就是重新使用你在开始时创建的RTCMediaStream对象,将它添加到新的对等连接中!只要确保在会话完成时终止对等连接对象。 RTCMediaStream对象当时没有什么需要完成的。
事情变得如此缓慢的原因是,每次创建新的捕捉器时,都不会适当地杀掉任何以前可能已经存在的事件。
谢谢你的提示,我现在休息了几天,但是当我回去工作时我会仔细研究它。 – Kevin 2014-10-01 10:52:08
对不起,花了这么长时间,我的代码是一团糟,所以我决定重写它的大部分。我现在正在重新使用除peerconnection之外的所有内容,但当我调用[peerConnection close]时,应用程序崩溃;你有什么想法,为什么这可能是? – Kevin 2014-10-14 07:05:31
你得到的错误是什么?对等连接是否为零?同时检查对等连接状态,看它是否由于某种原因未被关闭(在这种情况下,将是peerConnection.signalingState)。 – Cam 2014-10-15 18:49:06