Meine iOS 7 App vokalisiert Texte, wenn nötig.Wie kann ich meine App so einstellen, dass iPhone-Audio während des Sprechens schön unterbrochen wird?
Ich möchte dem Benutzer ermöglichen, seine Musik oder Podcasts (oder jede andere App mit Audio) zu hören, während meine läuft.
Das erwartete Verhalten ist, dass andere Audio entweder mixe oder ducken, wenn meine App spricht, dann die anderen Audio wieder aufnehmen seine Lautstärke auf der ursprünglichen Ebene direkt danach.
Ich habe viele Möglichkeiten versucht, dieses Ziel zu erreichen, aber nichts ist gut genug, da ich die Probleme auflisten, denen ich nach dem Code gegenüberstehe.
Meine aktuelle Implementierung basiert eine Sitzung vor dem Spiel oder Text-zu-Sprache zur Erstellung wie folgt:
+ (void)setAudioActive {
[[self class] setSessionActiveWithMixing:YES];
}
Nach dem Spiel/Rede, habe ich i wie folgt idled:
+ (void)setAudioIdle {
[[self class] setSessionActiveWithMixing:NO];
}
die Kernfunktion, welche die Einrichtung einer Sitzung entsprechend zu dem aktiven Parameterhandhaben, wie folgt:
+ (void)setSessionActiveWithMixing:(BOOL)active
{
NSError *error = NULL;
BOOL success;
AVAudioSession *session = [AVAudioSession sharedInstance];
static NSInteger counter = 0;
success = [session setActive:NO error:&error];
if (error) {
DDLogError(@"startAudioMixAndBackground: session setActive:NO, %@", error.description);
}
else {
counter--; if (counter<0) counter = 0;
}
if (active) {
AVAudioSessionCategoryOptions options = AVAudioSessionCategoryOptionAllowBluetooth
//|AVAudioSessionCategoryOptionDefaultToSpeaker
|AVAudioSessionCategoryOptionDuckOthers
;
success = [session setCategory://AVAudioSessionCategoryPlayback
AVAudioSessionCategoryPlayAndRecord
withOptions: options
error: &error];
if (error) {
// Do some error handling
DDLogError(@"startAudioMixAndBackground: setCategory:AVAudioSessionCategoryPlayback, %@", error.description);
}
else {
//activate the audio session
success = [session setActive:YES error:&error];
if (error) {
DDLogError(@"startAudioMixAndBackground: session setActive:YES, %@", error.description);
}
else {
counter++;
}
}
}
DDLogInfo(@"Audio session counter is: %ld",counter);
}
Meine aktuellen Ausgaben sind:
1) Wenn meine App zu sprechen beginnt, höre ich einige Könige von Glitch im Ton, was es nicht nett macht;
2) Wenn ich die Route mit Bluetooth verbinde, geht das zugrunde liegende Audio (sagen die Podcast oder iPod Musik) sehr leise und klingt laut, was meine Lösung einfach unbrauchbar macht, meine Benutzer werden diese Ebene ablehnen, schlechte Qualität.
3) Wenn andere Bluetooth angeschlossene Geräte versuchten, Töne zu emittieren (zB einem GPS im Auto oder Instanz), meine App erhält kein Interrupts (oder ich damit umgehen zu Unrecht), meinen Code sehen wie folgt aus:
- (void)startAudioMixAndBackground {
// initialize our AudioSession -
// this function has to be called once before calling any other AudioSession functions
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioSessionDidChangeInterruptionType:)
name:AVAudioSessionInterruptionNotification object:[AVAudioSession sharedInstance]];
// set our default audio session state
[[self class] setAudioIdle];
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
if ([self canBecomeFirstResponder]) {
[self becomeFirstResponder];
}
@synchronized(self) {
self.okToPlaySound = YES;
}
//MPVolumeSettingsAlertShow();
}
// want remote control events (via Control Center, headphones, bluetooth, AirPlay, etc.)
- (void)remoteControlReceivedWithEvent:(UIEvent *)event
{
if (event.type == UIEventTypeRemoteControl)
{
switch(event.subtype)
{
case UIEventSubtypeRemoteControlPause:
case UIEventSubtypeRemoteControlStop:
[[self class] setAudioIdle];
break;
case UIEventSubtypeRemoteControlPlay:
[[self class] setAudioActive];
break;
default:
break;
}
}
}
#pragma mark - Audio Support
- (void)audioSessionDidChangeInterruptionType:(NSNotification *)notification
{
AVAudioSessionInterruptionType interruptionType = [[[notification userInfo]
objectForKey:AVAudioSessionInterruptionTypeKey] unsignedIntegerValue];
if (AVAudioSessionInterruptionTypeBegan == interruptionType)
{
DDLogVerbose(@"Session interrupted: --- Begin Interruption ---");
}
else if (AVAudioSessionInterruptionTypeEnded == interruptionType)
{
DDLogVerbose(@"Session interrupted: --- End Interruption ---");
}
}
Haben Sie jemals eine Lösung für Ihr Problem gefunden? Ich habe Ihre Ausgabe Nummer 2 – Jan
Ach, nein. Klingt wie niemand weiß, wie man diese Dinge macht. Hast du irgendwas Besonderes gemacht, das helfen könnte? (auf die Frage, um Aufmerksamkeit zu erregen) @Jan –
Es sieht aus wie es viele Fragen in diesem Beitrag gibt. Nur um die Dinge aufzuklären, kannst du das Audio deiner App nicht mit der Musik des Nutzers ducken/mischen? Und als Ergebnis Ihrer Problemumgehung zeigen externe und Bluetooth-Audio * Störungen *? –