web-dev-qa-db-ja.com

アプリでBGMを再生しますか?

ユーザーがアプリを開いて音楽の再生を開始できるようにしたいと思います。ユーザーが任意のビューコントローラーに移動して、音楽を停止せずに最初のコントローラーに戻ることができるようにしたいと思います。無期限にループさせたい。

最初のViewControllerのviewDidLoadメソッドを入れて、再生を開始しようとしました。何が起こるかというと、ユーザーは最初のView Controllerを離れ、戻ってくると、元のコピーと重なって音楽の再生が再開されます。

これを修正するために、サウンドがすでに再生されているかどうかをチェックするifステートメントを配置して、別のコピーを起動しません。viewDidLoadメソッドはifステートメントを完全に無視し、とにかくそれを再度再生します。 viewDid/WillAppearも使ってみました。 applicationDidLaunchWithOptionsメソッドでアプリデリゲートにサウンドを入れてみましたが、完全に無音になりました。

13
user4984255

シングルトンの使用も同様に機能します。

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()
12
Astri

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")
    }
}

ステップ。コードを下からコピーしてViewControllerに貼り付けます

import AVFoundation  //import at the top

var player: AVAudioPlayer?  //declare in code

MusicHelper.sharedHelper.playBackgroundMusic() //paste in viewDidLoad
4

これが私のやり方です。このコードは、音楽の再生を開始するクラスシーン以外の場所に追加します。まったく新しい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")

テストしたところ、シーンを切り替えた後は完璧に動作します。

4
Jose Ramirez

「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)
    }
}

楽しんで。

2
Ben Rock

解決策を見つけました。 signalというビューコントローラープロパティを宣言しました。私は信号を言った:ブール? -次に、viewDidLoadに、signal == nilの場合にのみバックグラウンドソングを再生するifステートメントを配置します。次に、他のView Controllerで、mainviewcontrollerに戻ったときにsignal property = falseになるように設定しました。その後、曲は再び再生されず、すべてが正しく機能します。

1
user4984255

問題を解決ALHAMDULELLAHはXcode設定でのみ変更

設定ページに移動>>機能>>背景>>モード>>オーディオファイルを許可 enter image description here

0
hamayun zeb

for Swift 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")
        }
    }
0
Ruhtra Tam