Воспроизведение фоновой музыки в приложении?
Я хочу, чтобы пользователь мог открыть приложение и начать воспроизведение музыки. Я хочу, чтобы пользователь мог перейти на любой контроллер просмотра и вернуться к первоначальному без остановки музыки. Я хочу, чтобы он зацикливался на неопределенный срок.
Я попытался поместить метод viewDidLoad
в контроллер исходного представления, чтобы он начал играть. Что происходит, пользователь покидает исходный контроллер представления, и когда они возвращаются, музыка снова начинает воспроизводиться, перекрывая оригинальную копию.
Чтобы исправить это, я помещаю оператор if, проверяющий, должен ли звук уже воспроизводиться, чтобы не запускать другую копию, и метод viewDidLoad полностью игнорирует оператор if и в любом случае воспроизводит его снова. Я также попытался использовать viewDid/WillAppear
. Я попытался помещать звук в делегат приложения в метод applicationDidLaunchWithOptions
, и я получил полное молчание.
Ответы
Ответ 1
Использование Singleton работает также:
import AVFoundation
class MusicHelper {
static let sharedHelper = MusicHelper()
var audioPlayer: AVAudioPlayer?
func playBackgroundMusic() {
let aSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("coolsong", ofType: "mp3")!)
do {
audioPlayer = try AVAudioPlayer(contentsOfURL:aSound)
audioPlayer!.numberOfLoops = -1
audioPlayer!.prepareToPlay()
audioPlayer!.play()
} catch {
print("Cannot play the file")
}
}
}
Затем вы можете использовать его из любого класса (согласно Swift 2.1)
MusicHelper.sharedHelper.playBackgroundMusic()
Ответ 2
Вот как я сделал свое. Добавьте этот код в любом месте НАРУШЕНИЯ класса, где вы хотите, чтобы музыка начала воспроизводиться. Вы даже можете создать совершенно новый файл Swift и просто добавить этот код там (импортировать AVFoundation)
var backgroundMusicPlayer: AVAudioPlayer!
func playBackgroundMusic(filename: String) {
//The location of the file and its type
let url = NSBundle.mainBundle().URLForResource(filename, withExtension: "mp3")
//Returns an error if it can't find the file name
if (url == nil) {
println("Could not find the file \(filename)")
}
var error: NSError? = nil
//Assigns the actual music to the music player
backgroundMusicPlayer = AVAudioPlayer(contentsOfURL: url, error: &error)
//Error if it failed to create the music player
if backgroundMusicPlayer == nil {
println("Could not create audio player: \(error!)")
return
}
//A negative means it loops forever
backgroundMusicPlayer.numberOfLoops = -1
backgroundMusicPlayer.prepareToPlay()
backgroundMusicPlayer.play()
}
После этого перейдите к функции didMoveToView и вызовите функцию с именем файла.
playBackgroundMusic("IntroMusic")
Я только что протестировал его, и он отлично работает после переключения сцен.
Ответ 3
Просто добавьте "numberofLoops = -1", и он будет играть бесконечно в фоновом режиме.
Пример (Swift):
func playBackgroundMusic() {
do {
if let bundle = NSBundle.mainBundle().pathForResource("someMP3file", ofType: "mp3") {
let alertSound = NSURL(fileURLWithPath: bundle)
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
try AVAudioSession.sharedInstance().setActive(true)
try audioPlayer = AVAudioPlayer(contentsOfURL: alertSound)
audioPlayer.numberOfLoops = -1
audioPlayer.prepareToPlay()
audioPlayer.play()
}
} catch {
print(error)
}
}
Удачи.
Ответ 4
Найден решение. Я объявила свойство контроллера представления, называемое сигналом. Я сказал сигнал: Bool? - Тогда в viewDidLoad я помещаю оператор if только для воспроизведения фоновой песни, если signal == nil. Затем, в моих других контроллерах представления, я устанавливаю его так, что, когда они переходят к mainviewcontroller, свойство signal = false. Затем песня не будет воспроизводиться снова, и все будет работать правильно.
Ответ 5
Обновление Swift 4.2
Шаг 1 Сделайте новый класс "MusicHelper"
Шаг 2 Скопируйте и вставьте код снизу
import AVFoundation
class MusicHelper {
static let sharedHelper = MusicHelper()
var audioPlayer: AVAudioPlayer?
func playBackgroundMusic() {
let aSound = NSURL(fileURLWithPath: Bundle.main.path(forResource: "MUSICNAME(replece file name)", ofType: "mp3")!)
do {
audioPlayer = try AVAudioPlayer(contentsOf:aSound as URL)
audioPlayer!.numberOfLoops = -1
audioPlayer!.prepareToPlay()
audioPlayer!.play()
}
catch {
print("Cannot play the file")
}
}
Шаг 3 Скопируйте и вставьте код снизу
import AVFoundation //import at the top
var player: AVAudioPlayer? //declare in code
MusicHelper.sharedHelper.playBackgroundMusic() //paste in viewDidLoad
Ответ 6
для быстрого 4:
func playBackgroundMusic() {
let aSound = NSURL(fileURLWithPath: Bundle.main.path(forResource: "music", ofType: "mp3")!)
do {
audioPlayer = try AVAudioPlayer(contentsOf:aSound as URL)
audioPlayer!.numberOfLoops = -1
audioPlayer!.prepareToPlay()
audioPlayer!.play()
} catch {
print("Cannot play the file")
}
}
Ответ 7
решил проблему ALHAMDULELLAH только изменить в настройках XCode
перейдите на страницу настроек >> Возможности >> Фон >> Режимы >> Разрешить аудиофайл ![enter image description here]()
Ответ 8
Я думаю, вы должны попробовать в файле AppDelegate.swift.
В приложении метода (..... didFinishLaunchingWithOptions.....) {} определите ваши AVAudioPlayer() и .play()