2016-06-09 6 views
3

Neuere IOS-Geräte wie das 6S unterstützen nur native 48kHz-Wiedergabe. Nicht wirklich ein Problem, da Standard-CoreAudio-Graphen gut resample. Problem ist, wenn Sie eine VOIP-Art von App mit der Sprachverarbeitungseinheit machen, können Sie das Telefon nicht auf 44,1 kHz einstellen; es schafft eine schöne Darth-Vader-ähnliche Erfahrung!Wie erkennt man, ob das IOS-Gerät nur 48kHz in Hardware unterstützt?

Früher habe ich das Modell des Geräts überprüft und einfach gesagt: "Wenn es ein 6S oder später ist, dann muss ich 44.1 bis 48kHz resample", und das hat gut funktioniert. Ich mochte diesen Fix nicht, also probierte ich den folgenden Code:

session = [AVAudioSession sharedInstance]; 

[session setActive:YES error:&nsError]; 

if (systemSampleRate == 44100)  // We may need to resample if it's a phone that only supports 48kHz like the 6S or 6SPlus 
{ 
    [session setCategory:AVAudioSessionCategoryPlayback 
      withOptions:0 
        error:&nsError]; 

    result = [session setPreferredSampleRate:systemSampleRate error:&nsError]; 

    hardwareSampleRate = [session sampleRate]; 

    NSLog (@"Phone reports sample rate of %f", hardwareSampleRate); 

    if (hardwareSampleRate != (double)systemSampleRate)  // We can't set it!!!! 
     needsResampling = YES; 
    else 
    { 
     [session setCategory:AVAudioSessionCategoryRecord 
       withOptions:AVAudioSessionCategoryOptionAllowBluetooth 
         error:&nsError]; 

     result = [session setPreferredSampleRate:systemSampleRate error:&nsError]; 

     hardwareSampleRate = [session sampleRate]; 

     if (hardwareSampleRate != (double)systemSampleRate)  // We can't set it!!!! 
      needsResampling = YES; 
     else 
      needsResampling = NO; 
    } 
} 

Meistens funktioniert das. Die 6S-Geräte würden 48 kHz melden, und alle anderen würden 44,1 kHz melden. ABER, wenn es an ein Bluetooth-Headset-System gebunden wurde, das nur 8-kHz-Mikrofon-Audio und 44,1 kHz-Wiedergabe unterstützt, meldet der erste Hardware-Sample-Rate-Wert 44,1 !!!! Also gehe ich davon aus, dass das Gerät nativ 44.1 unterstützt und alles kaputt geht.

SO ist die Frage: Wie finde ich heraus, ob das native Abspielgerät auf IOS physikalisch nur 48kHz unterstützt oder sowohl 44,1 als auch 48kHz unterstützen kann? Apples öffentliches Dokument dazu ist wertlos, es schüchtert Leute einfach dafür ein, dass ein Gerät beides unterstützt, ohne dir zu sagen, wie es herauszufinden ist.

+0

Woher haben Sie systemSampleRate? – dave234

+0

Ah, sollte erwähnt haben. Das ist die gewünschte Abtastrate, bei der das System "laufen" möchte. Es wird einfach in diese Routine übernommen und an anderer Stelle definiert. Es hat nur Werte von entweder 44100 oder 48000. – chuckd

+0

Wo ist es definiert? – dave234

Antwort

1

Sie müssen wirklich nur davon ausgehen, dass sich die Abtastrate ändern kann. Wenn systemSampleRate eine externe Anforderung ist, versuchen Sie, die Abtastrate auf diese zu setzen und dann mit dem zu arbeiten, was Sie erhalten. Der Haken dabei ist, dass Sie diese Überprüfung jedes Mal durchführen müssen, wenn Ihre Audio-Wiedergabekette startet oder unterbrochen wird, falls sich die Abtastrate ändert.

Ich benutze zwei verschiedene Wege, um dies zu handhaben, beide beinhalten das Abreißen und Reinitialisieren meiner Audioeinheitskette, wenn sich die Abtastrate ändert.

Ein einfacher Weg besteht darin, alle Sampling-Raten meiner Audio-Einheit auf die System-Sample-Rate einzustellen (bereitgestellt durch die Sample-Rate-Eigenschaft einer aktiven Audio-Session). Ich gehe davon aus, dass dies die höchste Qualitätsmethode ist, da es keine Abtastratenumwandlung gibt.

Wenn ich eine Abtastratenanforderung habe, erstelle ich meine Kette mit meiner erforderlichen Abtastrate. Überprüfen Sie dann, ob die Systemabtastrate von meiner Anforderung abweicht. Wenn es anders ist, setze ich Konvertereinheiten zwischen die Systemeinheit (Remote-IO) und die Enden meiner Kette.

Die Quintessenz ist, dass die wichtigste Information ist, ob die Systemabtastrate von Ihrer Anforderung abweicht oder nicht, nicht ob sie sich ändern kann oder nicht. Es ist ein absoluter Schmerz, und eine Reihe von Audio-Apps ist kaputt gegangen, als die 6S herauskam, aber es ist der richtige Weg, um vorwärts zu kommen.

+1

Hier ist das Problem. Wenn Sie versuchen, die kAudioUnitSubType_VoiceProcessingIO bei 44100 auf einem 6S oder 6S Plus zu verwenden, akzeptiert das System es (und sagt sogar, dass es bei 44100 läuft), wird aber schreckliche Audioartefakte erzeugen. Diese Telefone müssen bei 48000 laufen und ein externes Resampling außerhalb von CoreAudio durchgeführt werden. Es ist einfach, das Modell des Telefons zu sagen, aber ich hasse die Annahme, dass alle zukünftigen Geräte immer bei 48000 laufen müssen. – chuckd

Verwandte Themen