una stories que puedo porque por poner musica historia hacer funciona etiquetar con como cancion ios xcode swift audio mobile

ios - stories - por que no puedo poner musica en instagram iphone



¿Cómo puedo permitir que la música de fondo continúe sonando mientras mi aplicación todavía reproduce sus sonidos mientras usa Swift? (9)

**

Actualizado para Swift 3.0

**

El nombre del sonido que estoy reproduciendo es shatter.wav

func shatterSound() { if let soundURL = Bundle.main.url(forResource: "shatter", withExtension: "wav") { var mySound: SystemSoundID = 0 AudioServicesCreateSystemSoundID(soundURL as CFURL, &mySound) AudioServicesPlaySystemSound(mySound); } }

Entonces, donde quiera que quiera reproducir la llamada de sonido

shatterSound()

Creé una aplicación e intento permitir que el usuario continúe escuchando su música mientras juegue, pero cada vez que presionen "play" y se produzcan los sonidos dentro del juego, detendrá la música de fondo. Estoy desarrollando en iOS usando Swift. Aquí hay una parte del código que inicia los sonidos dentro del juego.

func playSpawnedDot() { var alertSound: NSURL = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("spawnDot", ofType: "mp3")!)! var error:NSError? audioPlayer = AVAudioPlayer(contentsOfURL: alertSound, error: &error) audioPlayer.prepareToPlay() if volumeBool { audioPlayer.play() } }


Esto es lo que estoy usando para Swift 2.0:

let sess = AVAudioSession.sharedInstance() if sess.otherAudioPlaying { _ = try? sess.setCategory(AVAudioSessionCategoryAmbient, withOptions: .DuckOthers) _ = try? sess.setActive(true, withOptions: []) }

Tenga en cuenta que puede reemplazar .DuckOthers con [] si no desea reducir la música de fondo y, en su lugar, jugar en la parte superior.


La solución de lchamp funcionó perfectamente para mí, adaptada para Objective-C:

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


No creía que simplemente establecer la sesión de audio de AVAudioSitio en AVAudioSessionCategoryOptions.duckOthers funcionaría, pero lo hizo. Aquí está mi código completo para ayudar a los novatos como yo.

Swift 4 - Ejemplo completo :

var audioPlayer = AVAudioPlayer() func playSound(sound: String){ let path = Bundle.main.path(forResource: sound, ofType: nil)! let url = URL(fileURLWithPath: path) let audioSession = AVAudioSession.sharedInstance() try!audioSession.setCategory(AVAudioSessionCategoryPlayback, with: AVAudioSessionCategoryOptions.duckOthers) do { audioPlayer = try AVAudioPlayer(contentsOf: url) audioPlayer.play() } catch { print("couldn''t load the file") } }

Todavía tengo que descubrir setActive ( estaba viendo esta publicación de blog ) pero el audio deja de agacharse cuando salgo de la aplicación, por lo que funciona para mi aplicación.


Para Swift (Objective-C como este también)

puede usar this enlace para obtener la mejor respuesta y si no tiene tiempo para ver 10 minutos, la mejor acción es copy código debajo en su AppDelegate en didFinishLaunchingWithOptions y luego seleccionar project''s target su project''s target luego ir a Capabilities y finalmente en Background modes comprueban Audio, AirPlay and Picture in Picture

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. let session = AVAudioSession.sharedInstance() do { try session.setCategory(AVAudioSessionCategoryPlayback) } catch { } }


Si quieres reproducir un sonido de alerta:

public func playSound(withFileName fileName: String) { if let soundUrl = Bundle.main.url(forResource: fileName, withExtension: "wav") { do { try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient, with:[.duckOthers]) try AVAudioSession.sharedInstance().setActive(true) var soundId: SystemSoundID = 0 AudioServicesCreateSystemSoundID(soundUrl as CFURL, &soundId) AudioServicesAddSystemSoundCompletion(soundId, nil, nil, { (soundId, clientData) -> Void in AudioServicesDisposeSystemSoundID(soundId) do { // This is to unduck others, make other playing sounds go back up in volume try AVAudioSession.sharedInstance().setActive(false) } catch { DDLogWarn("Failed to set AVAudioSession to inactive. error=/(error)") } }, nil) AudioServicesPlaySystemSound(soundId) } catch { DDLogWarn("Failed to create audio player. soundUrl=/(soundUrl) error=/(error)") } } else { DDLogWarn("Sound file not found in app bundle. fileName=/(fileName)") } }

Y si quieres escuchar música:

importar AVFoundation

var audioPlayer:AVAudioPlayer? public func playSound(withFileName fileName: String) { if let soundUrl = Bundle.main.url(forResource: fileName, withExtension: "wav") { do { try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient, with:[.duckOthers]) try AVAudioSession.sharedInstance().setActive(true) let player = try AVAudioPlayer(contentsOf: soundUrl) player.delegate = self player.prepareToPlay() DDLogInfo("Playing sound. soundUrl=/(soundUrl)") player.play() // ensure the player does not get deleted while playing the sound self.audioPlayer = player } catch { DDLogWarn("Failed to create audio player. soundUrl=/(soundUrl) error=/(error)") } } else { DDLogWarn("Sound file not found in app bundle. fileName=/(fileName)") } } func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) { self.audioPlayer?.stop() do { // This is to unduck others, make other playing sounds go back up in volume try AVAudioSession.sharedInstance().setActive(false) } catch { DDLogWarn("Failed to set AVAudioSession inactive. error=/(error)") } }


AVAudioSession configurar la categoría AVAudioSession , con uno de los siguientes valores: https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVAudioSession_ClassReference/index.html (AVAudioSession Class Reference).

El valor predeterminado está establecido en AVAudioSessionCategorySoloAmbient . Como puedes leer:

[...] usar esta categoría implica que el audio de la aplicación no se puede mezclar; la activación de la sesión interrumpirá cualquier otra sesión de audio que tampoco se pueda mezclar. Para permitir la mezcla, use la categoría AVAudioSessionCategoryAmbient lugar.

Tienes que cambiar la categoría, antes de reproducir tu sonido. Para hacerlo:

AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient, error: nil) AVAudioSession.sharedInstance().setActive(true, error: nil)

No necesita llamar a esas líneas cada vez que reproduce el sonido. Es posible que desee hacerlo solo una vez.


Así es como lo hago en Swift 3.0

var songPlayer : AVAudioPlayer? func SetUpSound() { if let path = Bundle.main.path(forResource: "TestSound", ofType: "wav") { let filePath = NSURL(fileURLWithPath:path) songPlayer = try! AVAudioPlayer.init(contentsOf: filePath as URL) songPlayer?.numberOfLoops = -1 //logic for infinite loop songPlayer?.prepareToPlay() songPlayer?.play() } let audioSession = AVAudioSession.sharedInstance() try!audioSession.setCategory(AVAudioSessionCategoryPlayback, with: AVAudioSessionCategoryOptions.duckOthers) //Causes audio from other sessions to be ducked (reduced in volume) while audio from this session plays }

Puede ver más de AVAudioSessionCategoryOptions aquí: https://developer.apple.com/reference/avfoundation/avaudiosessioncategoryoptions


Swift 4 versión:

try? AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient) try? AVAudioSession.sharedInstance().setActive(true)