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库,xcodeiOS

您正确的方向!

您需要做的不是在开始时创建捕获器,而是创建视频源,localvideotrack,localaudiostream和RTCMediaStream对象。一旦创建localvideotrack和localaudiostream,将em添加到可用于类的RTCMediaStream对象。然后,当你想开始一个对话时,你需要做的就是重新使用你在开始时创建的RTCMediaStream对象,将它添加到新的对等连接中!只要确保在会话完成时终止对等连接对象。 RTCMediaStream对象当时没有什么需要完成的。

事情变得如此缓慢的原因是,每次创建新的捕捉器时,都不会适当地杀掉任何以前可能已经存在的事件。

+0

谢谢你的提示,我现在休息了几天,但是当我回去工作时我会仔细研究它。 – Kevin 2014-10-01 10:52:08

+0

对不起,花了这么长时间,我的代码是一团糟,所以我决定重写它的大部分。我现在正在重新使用除peerconnection之外的所有内容,但当我调用[peerConnection close]时,应用程序崩溃;你有什么想法,为什么这可能是? – Kevin 2014-10-14 07:05:31

+0

你得到的错误是什么?对等连接是否为零?同时检查对等连接状态,看它是否由于某种原因未被关闭(在这种情况下,将是peerConnection.signalingState)。 – Cam 2014-10-15 18:49:06