Проблемы со звуком в собственном приложении 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"]

                                 ];

необязательные ограничения = @[

                                [[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

Какие-либо предложения?


person Aft3rmath    schedule 07.10.2015    source источник
comment
мы вчера наблюдали нечто подобное. проект webrtc усердно работает над AEC, и я выясняю, не мешает ли это родным аудиосервисам iOS.   -  person sheffler    schedule 09.10.2015
comment
звучит как что-то похожее. пожалуйста, дайте мне знать, если вы разберетесь с этим   -  person Aft3rmath    schedule 12.10.2015


Ответы (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];
                             }];
person Jidong Chen    schedule 26.08.2016
comment
В каком месте кода это должно вызываться? Это все еще верно год спустя с последним WebRTC на iOS? - person sethfri; 12.10.2017