Воспроизведение фоновой музыки в приложении?

Я хочу, чтобы пользователь мог открыть приложение и начать воспроизведение музыки. Я хочу, чтобы пользователь мог перейти на любой контроллер просмотра и вернуться к первоначальному без остановки музыки. Я хочу, чтобы он зацикливался на неопределенный срок.

Я попытался поместить метод 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()