Swift - Audio Playback

Aus Wikizone
Version vom 28. Januar 2023, 12:09 Uhr von Steff (Diskussion | Beiträge) (→‎Audio in background)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

TODO

Links

Swift (Programmiersprache)
Swift - Play a Sound

Einführung

Es gibt untschiedliche Möglichkeiten Audio abzuspielen je nachdem was man möchte.

Jede Möglichkeit ist unterschiedlich aufwändig. Es gibt außerdem Klassen um den Systemmixer zu steuern oder das Verhalten wenn die App in den Hintergrund geht zu beeinflussen.

Glossar

AVFoundation

AVAudioSession

AVAudioSession ist ein Singleton-Objekt, das die Audio-Sitzung für Ihre App verwaltet. Es ist verantwortlich für die Konfiguration der Audio-Routen, wie dem Ausgabegerät (z.B. Lautsprecher oder Headset) und für die Verwaltung des Zustands der Audio-Sitzung (z.B. aktiv oder inaktiv). AVAudioSession bietet auch Methoden zur Steuerung der Eigenschaften der Audio-Sitzung, wie der Lautstärke und der Audio-Kategorie.

AVAudioPlayerNode

AVAudioPlayerNode wird verwendet, um Audio-Puffer und -Dateien innerhalb eines AVAudioEngine-Graphen abzuspielen. Es kann verwendet werden, um das Abspielen von Audio-Puffern und -Dateien zu planen, die Wiedergabegeschwindigkeit, den Pan und die Lautstärke zu ändern und einen Rückruf bereitzustellen, wenn die Wiedergabe abgeschlossen ist.

Zusammengefasst wird AVAudioSession verwendet, um die Gesamt-Audio-Sitzung für Ihre App zu konfigurieren, während AVAudioPlayerNode verwendet wird, um spezifische Audio-Puffer und -Dateien innerhalb dieser Sitzung abzuspielen.

Audio im Hintergrund abspielen

App für Hintergrundplayback konfigurieren

In Info.plist

...
<plist version="1.0">
<dict>
...
    <key>UIBackgroundModes</key>
    <array>
        <string>audio</string>
    </array>
</dict>
</plist>

Mit AVAudioPlayer

Wenn du die AVAudioPlayer Klasse nutzt stelle die numberOfLoops property to -1 so that the audio will play indefinitely.

audioPlayer.numberOfLoops = -1
audioPlayer.play()

Außerdem mußt du in der AVAudioSession die korrekte Kategorie setzen. Die Kategorie legt z.B. fest wie mit welcher Priorität Background Audio behandelt wird, falls ein Anfruf reinkommt etc.

try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default)

Es gibt außerdem auch eine maximale Dauer die das System für Background Audio erlaubt. Die genaue Zeit hängt von verschiedenen Faktoren ab. Unter anderem welche Ressourcen die App benötigt und auf welche Art Audio abgespielt wird. Wenn die App vom System beendet wird ist natürlich Schluss mit Ton.

Mit AVAudioEngine

Hier ist das Vorgehen ähnlich - auch hier musst du die AVAudioSession richtig konfigurieren:

        // Audio session should play in background
        let audioSession = AVAudioSession.sharedInstance()
        do {
            try audioSession.setCategory(.playback)
            // try AVAudioSession.sharedInstance().setActive(true) // neeeded?
        } catch {
            print("Setting category to AVAudioSessionCategory .playback failed.")
        }

Evtl. muss man die Session noch aktivieren. Aber bei meinen Tests war das nicht nötig. Sie wurde automatisch (wahrscheinlich über die AudioEngine) aktiviert (siehe Kommentar im Code.

Allgemeine Tipps für Apps im Background

However, you can help the system to save energy by following some best practices:

   Minimize the use of location services, push notifications, and background tasks when your app is not in use.
   Use the beginBackgroundTaskWithExpirationHandler method to execute any critical tasks before your app is suspended.
   Avoid using CPU-intensive tasks when your app is in the background, as this can drain the battery.
   When your app is not in use, release any resources that are not needed, such as images and sounds.

By following these practices, your app will be less likely to consume excessive power and will provide a better user experience by not draining the battery.

It is also possible to suggest to the user to close the app when it's not in use, or to use low power mode in the settings.

Keep in mind that, as a developer, you don't have the power to force the app to go to background or to shut down, but by following best practices you can help the system to save energy.