2017-03-27 42 views
0

我正在開發WebRTC iOS應用程序以接收來自網絡攝像頭的視頻/音頻。 只有攝像頭髮送視頻和音頻,移動設備不會發送任何內容。libjingle iOS:不要求麥克許可

我正在使用CocoaPods的libjingle_peerconnection庫(v11177.2.0)。

一切正常,我正確接收視頻和音頻,但我有一個設備權限問題。第一次使用該應用程序時,當我想要從網絡攝像頭接收視頻時,iOS應用程序會詢問麥克風許可權。 這很重要,因爲設備不發送音頻,而我的客戶說「爲什麼應用程序要求麥克風?」

這很奇怪,因爲相機的應用程序不需要任何許可。

我檢查了SDP,它似乎都沒問題(報價和答案)。

這是我創作的PeerConnection等對象不附加任何流的方式來:

RTCICEServer *stunServer = [[RTCICEServer alloc]initWithURI:[NSURL URLWithString:@"stun:stun.l.google.com:19302"] username:@"" password:@""]; 
    NSMutableArray *iceServers = [NSMutableArray arrayWithObject:stunServer]; 

RTCPeerConnectionFactory *factory = [[RTCPeerConnectionFactory alloc]init]; 

NSArray *peerConnectionConstraints = @[[[RTCPair alloc] initWithKey:@"DtlsSrtpKeyAgreement" value:@"true"]]; 
RTCMediaConstraints *peerConnectionConstraints = [[RTCMediaConstraints alloc]initWithMandatoryConstraints:peerConnectionConstraints optionalConstraints:nil]; 

RTCPeerConnection *pConnection = [factory peerConnectionWithICEServers:iceServers constraints:peerConnectionConstraints delegate:self]; 

NSArray *sdpConstraints = @[[[RTCPair alloc] initWithKey:@"OfferToReceiveAudio" value:@"true"], 
          [[RTCPair alloc] initWithKey:@"OfferToReceiveVideo" value:@"true"]]; 

RTCMediaConstraints* sdpConstraints = [[RTCMediaConstraints alloc] initWithMandatoryConstraints:sdpConstraints optionalConstraints:nil]; 
[pConnection createOfferWithDelegate:self constraints:sdpConstraints]; 

這裏是SDP提議產生:

v=0 
o=- 6528383367639880158 2 IN IP4 127.0.0.1 
s=- 
t=0 0 
a=group:BUNDLE audio video 
a=msid-semantic: WMS 
m=audio 9 RTP/SAVPF 111 103 104 9 102 0 8 127 126 
c=IN IP4 0.0.0.0 
a=rtcp:9 IN IP4 0.0.0.0 
a=ice-ufrag:0QOsaBCKhCBBcHz5 
a=ice-pwd:/y5snrrO3Qmq37m2aejRbK1E 
a=mid:audio 
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level 
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time 
a=recvonly 
a=rtcp-mux 
a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:x1lfnVdo9lCRa9ykH6759WhY1SnI+dbLjKNbkTl+ 
a=rtpmap:111 opus/48000/2 
a=fmtp:111 minptime=10; useinbandfec=1 
a=rtpmap:103 ISAC/16000 
a=rtpmap:104 ISAC/32000 
a=rtpmap:9 G722/8000 
a=rtpmap:102 ILBC/8000 
a=rtpmap:0 PCMU/8000 
a=rtpmap:8 PCMA/8000 
a=rtpmap:127 red/8000 
a=rtpmap:126 telephone-event/8000 
a=maxptime:60 
m=video 9 RTP/SAVPF 100 101 116 117 96 
c=IN IP4 0.0.0.0 
a=rtcp:9 IN IP4 0.0.0.0 
a=ice-ufrag:0QOsaBCKhCBBcHz5 
a=ice-pwd:/y5snrrO3Qmq37m2aejRbK1E 
a=mid:video 
a=extmap:2 urn:ietf:params:rtp-hdrext:toffset 
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time 
a=extmap:4 urn:3gpp:video-orientation 
a=recvonly 
a=rtcp-mux 
a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:x1lfnVdo9lCRa9ykH6759WhY1SnI+dbLjKNbkTl+ 
a=rtpmap:100 VP8/90000 
a=rtcp-fb:100 ccm fir 
a=rtcp-fb:100 nack 
a=rtcp-fb:100 nack pli 
a=rtcp-fb:100 goog-remb 
a=rtcp-fb:100 transport-cc 
a=rtpmap:101 VP9/90000 
a=rtcp-fb:101 ccm fir 
a=rtcp-fb:101 nack 
a=rtcp-fb:101 nack pli 
a=rtcp-fb:101 goog-remb 
a=rtcp-fb:101 transport-cc 
a=rtpmap:116 red/90000 
a=rtpmap:117 ulpfec/90000 
a=rtpmap:96 rtx/90000 
a=fmtp:96 apt=100 

這裏是從網絡攝像頭的SDP應答:

v=0 
o=- 3699612909 3699612909 IN IP4 0.0.0.0 
s=- 
c=IN IP4 0.0.0.0 
t=0 0 
a=msid-semantic: WMS 
a=group:BUNDLE audio video 
m=audio 1 RTP/SAVPF 111 0 
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time 
a=mid:audio 
a=rtcp:9 IN IP4 0.0.0.0 
a=rtpmap:111 opus/48000/2 
a=rtpmap:0 PCMU/8000 
a=sendonly 
a=rtcp-mux 
a=fmtp:111 minptime=10; useinbandfec=1 
a=maxptime:60 
a=ssrc:3192391506 cname:[email protected] 
a=ice-ufrag:r2kq 
a=ice-pwd:6VJu/y0Kbc4iUDQB/1ZrnE 
a=fingerprint:sha-256 57:26:29:A5:DD:CD:42:74:C9:A3:BB:C4:67:D1:1C:24:E9:4B:4C:86:6F:93:32:03:52:6B:2B:77:B3:C4:E8:88 
m=video 1 RTP/SAVPF 100 
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time 
a=mid:video 
a=rtcp:9 IN IP4 0.0.0.0 
a=rtpmap:100 VP8/90000 
a=rtcp-fb:100 ccm fir 
a=rtcp-fb:100 nack 
a=rtcp-fb:100 nack pli 
a=rtcp-fb:100 goog-remb 
a=sendonly 
a=rtcp-mux 
a=ssrc:455461391 cname:[email protected]st-6a96398f 
a=ice-ufrag:r2kq 
a=ice-pwd:6VJu/y0Kbc4iUDQB/1ZrnE 
a=fingerprint:sha-256 57:26:29:A5:DD:CD:42:74:C9:A3:BB:C4:67:D1:1C:24:E9:4B:4C:86:6F:93:32:03:52:6B:2B:77:B3:C4:E8:88 

正如你所看到的,在SDP (媒體(音頻和視頻))都是「僅接收」,並且在SDP回答「sendOnly」中,所以我認爲沒有與SDP相關的問題。

任何人都知道爲什麼要求麥克風許可?如果您需要更多信息,請告訴我。

謝謝!

回答

1

我沒有你的代碼/庫的工作,對於這部分,我不能幫助,但是從Apple documentation,我們可以讀到:

首次應用的音頻會話嘗試使用音頻輸入 路由,同時使用啓用記錄的類別,系統 自動提示用戶許可。您可以通過調用請求記錄權限(_:)方法明確地詢問 。直到 用戶授予您的應用程序權限才能錄製,您的應用程序可以只錄制 靜音。

這可能會給你一個線索,某處(可能在libjingle中)正在訪問iOS Audio Session,可能是什麼觸發了麥克風權限。

0

你在這裏。你需要像

-(RTCMediaStream*)createLocalMediaStream 
{ 
RTCMediaStream* localStream = [_factory mediaStreamWithLabel:@"ARDAMS"]; 

if(![[ReveSingleton sharedManager].localCallControl isEqualToNumber:@251]) 
{ 
    RTCVideoTrack* localVideoTrack; 
    localVideoTrack = [self createLocalVideoTrack]; 

    if (localVideoTrack) { 
     [localStream addVideoTrack:localVideoTrack]; 
     [_delegate appClient:self didReceiveLocalVideoTrack:localVideoTrack]; 
    } 
} 

[localStream addAudioTrack:[_factory audioTrackWithID:@"ARDAMSa0"]]; 
if (_isSpeakerEnabled) 
    [self enableSpeaker]; 
return localStream; 
} 

創建本地流的方法createLocalVideoTrack會像

- (RTCVideoTrack*)createLocalVideoTrack 
{ 

RTCVideoTrack* localVideoTrack = nil; 
#if !TARGET_IPHONE_SIMULATOR && TARGET_OS_IPHONE 

NSString* cameraID = nil; 
for (AVCaptureDevice* captureDevice in 
    [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]) { 
    if (captureDevice.position == AVCaptureDevicePositionFront) { 
     cameraID = [captureDevice localizedName]; 
     [captureDevice lockForConfiguration:nil]; 
     //configure frame rate 

     [captureDevice unlockForConfiguration]; 
     // [AVCaptureDevice release]; 
     break; 
    } 
} 
NSAssert(cameraID, @"Unable to get the front camera id"); 

RTCVideoCapturer* capturer = [RTCVideoCapturer capturerWithDeviceName:cameraID]; 
RTCMediaConstraints* mediaConstraints = [self defaultMediaStreamConstraints]; 
RTCVideoSource* videoSource = [_factory videoSourceWithCapturer:capturer constraints:mediaConstraints]; 
localVideoTrack = [_factory videoTrackWithID:@"ARDAMSv0" source:videoSource]; 
#endif 
return localVideoTrack; 


} 

攝像頭和麥克風權限將在屏幕上被要求當代碼將被處理。

+0

他的問題是,即使未使用錄製,也會詢問麥克風權限。據你說,這仍然要求麥克風許可(?),並沒有解決問題。 –