Проблемы со звуком в приложении WebRTC для iOS с последними ревизиями
Я пытаюсь создать iOS аудио / видео чат и застрял на аудио. Звук отстает, пропускает некоторые части и искажает. Я попытался сделать это с r9919 и последней версией (r10184), созданной с помощью нетронутых сценариев сборки. Но когда я попытался использовать более старые версии (r8444, r8926, r9132 и r9137), взятые из демонстрационного проекта PerchRTC ( https://github.com/perchco/perchrtc - толстая библиотека и публичные заголовки), все было в порядке (кроме небольшого эха). Какие действия следует выполнить, чтобы добиться по крайней мере того же качества потоковой передачи, что и (r8444, r8926, r9132 и r9137)? Я также пытался использовать разные аудиокодеки и разные медиа ограничения, но все же не повезло. Я создаю аудио соединение таким образом
RTCMediaStream *localStream = [_pcFactory mediaStreamWithLabel:@"ARDAMS"];
RTCAudioTrack *localAudioTrack = [_pcFactory audioTrackWithID:@"ARDAMSa0"];
localAudioTrack.delegate = self;
[localStream addAudioTrack:localAudioTrack];
[self.peerConnection addStream:localStream];
[self.peerConnection createOfferWithDelegate:self constraints:_constraints];
используя эти ограничения (пробовал разные комбинации)
обязательное ограничение = @ [
[[RTCPair alloc] initWithKey:@"OfferToReceiveAudio" value:@"true"]
];
optionConstraints = @[
[[RTCPair alloc] initWithKey:@"internalSctpDataChannels" value:@"true"],
[[RTCPair alloc] initWithKey:@"DtlsSrtpKeyAgreement" value:@"true"]
];
Также я попытался по-разному манипулировать AVAudioSession до получения audioTrack, но безуспешно:
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&categoryError];
[audioSession setMode:AVAudioSessionModeVoiceChat error:&modeError];
[audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideNone error:&overrideError];
[audioSession setActive:YES withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:&activeError];
Описания SDP выглядят одинаково в отстающих и не отстающих сборках (это предложение - a=setup:actpass, ответ имеет a=setup:active):
sdp = "v=0
o=- 7772121714021031999 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE audio
a=msid-semantic: WMS ARDAMS
m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 102 0 8 106 105 13 127 126
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:XLpFvB+JEaSN7tww
a=ice-pwd:9hoMfb7AJ9jC6Weej7qqTWkT
a=fingerprint:sha-256 AE:73:33:DD:31:CA:84:5A:96:4D:68:27:A0:23:82:3C:08:3B:7F:7B:A2:FE:91:1D:A7:3A:1F:2A:58:4B:FF:A2
a=setup:actpass
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=sendrecv
a=rtcp-mux
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:106 CN/32000
a=rtpmap:105 CN/16000
a=rtpmap:13 CN/8000
a=rtpmap:127 red/8000
a=rtpmap:126 telephone-event/8000
a=maxptime:60
a=ssrc:2797474154 cname:43zbAmj6VvYHT31F
a=ssrc:2797474154 msid:ARDAMS ARDAMSa0
a=ssrc:2797474154 mslabel:ARDAMS
a=ssrc:2797474154 label:ARDAMSa0
Какие-либо предложения?
1 ответ
Демо использует верхний динамик по умолчанию. Вам нужно установить основной динамик, используя код, подобный следующему:
AVAudioSessionPortOverride override = AVAudioSessionPortOverrideSpeaker;
[RTCDispatcher dispatchAsyncOnType:RTCDispatcherTypeAudioSession
block:^{
RTCAudioSession *session = [RTCAudioSession sharedInstance];
[session lockForConfiguration];
NSError *error = nil;
if ([session overrideOutputAudioPort:override error:&error]) {
_portOverride = override;
} else {
RTCLogError(@"Error overriding output port: %@",
error.localizedDescription);
}
[session unlockForConfiguration];
}];