9

Chciałbym nagrać wideo z dźwiękiem za pomocą AVCaptureSession. Do tego potrzebuję AudioSessionCategory AVAudioSessionCategoryPlayAndRecord, ponieważ moja aplikacja odtwarza również wideo z dźwiękiem.AVAudioSession AVAudioSessionCategoryPlayAndRecord glitch

Chcę, aby dźwięk był słyszalny z głośnika domyślnego i chcę go miksować z innym dźwiękiem. Potrzebuję więc opcji AVAudioSessionCategoryOptionDefaultToSpeaker | AVAudioSessionCategoryOptionMixWithOthers.

Gdybym wykonać następujące czynności podczas gdy inny dźwięk jest odtwarzany istnieje wyraźna słyszalny usterka w audio z innej aplikacji:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionMixWithOthers | AVAudioSessionCategoryOptionDefaultToSpeaker error:nil]; 
[[AVAudioSession sharedInstance] setActive:YES error:nil]; 

Czy istnieje sposób, aby pozbyć się tej usterki?

Wygląda na to, że jest AVAudioSessionRouteChangeReasonRouteConfigurationChange po zgłoszeniu przez AVAudioSessionRouteChangeReasonCategoryChange z braku wejścia mikrofonowego do wejścia mikrofonowego.

Zmiana konfiguracji (i usterka) występuje również, gdy aplikacja przechodzi do tła (z lub bez dezaktywacji sesji audio). Podczas powrotu z tła bez dezaktywowania sesji audio, zakłócenia zaczynają występować, gdy konfiguracja AVCaptureSession ulega zmianie, tj. Gdy kamera jest przełączana z przodu na tył. W tym przypadku ścieżka dźwiękowa nie jest dotykana i pojawia się tylko przy powrocie z tła bez dezaktywacji sesji audio. Powiadomienie o zmianie trasy jest uruchamiane dwukrotnie. Aby wyłączyć mikrofon i raz, aby włączyć go ponownie.

Należy zauważyć, że to zachowanie można łatwo odtworzyć, pobierając przykład AVCamManual firmy Apple. Dodaj następujący kod do viewDidLoad z AAPLCameraViewController.m:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionMixWithOthers | AVAudioSessionCategoryOptionDefaultToSpeaker error:nil]; 
[[AVAudioSession sharedInstance] setActive:YES error:nil]; 
… 
session.usesApplicationAudioSession = YES; 
session.automaticallyConfiguresApplicationAudioSession = NO; 

niektóre inne dziwne rzeczy, które mogą być powiązane:

Ustaw kategorię audio do AVAudioSessionCategoryAmbient pierwszy i aktywować go:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient withOptions:0 error:nil]; 
[[AVAudioSession sharedInstance] setActive:YES error:nil]; 

a następnie zmień kategorię:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionMixWithOthers | AVAudioSessionCategoryOptionDefaultToSpeaker error:nil]; 

inne dźwięki przestają się wyświetlać pomimo flagi opcji. Żadne błędy nie są zgłaszane.

+0

Mam wszystkie te same problemy. Co do litery. Jakieś wiadomości na ten temat? – ancajic

+0

Dla Twojego ostatniego przykładu, gdzie dźwięk przestaje być odtwarzany pomimo opcji opcji. Dźwięk będzie odtwarzany po wyłączeniu sesji audio ("[AVAudioSession sharedInstance] setActive: NO withOptions: AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error: nil];') przed ustawieniem kategorii "[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayAndRecord withOptions: AVAudioSessionCategoryOptionMixWithInne | AVAudioSessionCategoryOptionDefaultToSpeaker error: nil]; '. I ponownie aktywuj po ("[AVAudioSession sharedInstance] setActive: TAK błąd: zero];') – ancajic

+0

Mając te same problemy, przez cały czas próbowałem używać 'PlayAndRecord': http://stackoverflow.com/questions/35496563/avcapturesession-addinput-powoduje-glitch-in-background-audio. Próbowano także pracować, zmieniając kategorię z "Ambient", gdy rozpoczyna się nagrywanie: http://stackoverflow.com/questions/35615707/avaudiosession-setcategory-not-working. Daj mi znać, jeśli znalazłeś rozwiązanie dla którejkolwiek z metod: – Cbas

Odpowiedz

0

Jak zauważyli @Cbas w komentarzach, personel Apple potwierdził, że występuje usterka podczas przełączania z tras wyjściowych tylko na wejściowe i wyjściowe i że nie ma obejścia tego problemu, możliwym rozwiązaniem jest całkowite uniknięcie przełączając się z tras wyłącznie na wyjście na trasy wejścia-wyjścia, zawsze używaj kategorii AVAudioSessionCategoryPlayAndRecord, nawet jeśli aplikacja nie nagrywa. Nie należy również ustawiać kategorii sesji audio, jeśli została już ustawiona na AVAudioSessionCategoryPlayAndRecord lub wystąpi usterka.