web-dev-qa-db-ja.com

AVAudioPlayerがSwift

このコードは非常に単純な単一のビューにありますSwiftアプリケーションのViewController

var audioPlayer = AVAudioPlayer()

@IBAction func playMyFile(sender: AnyObject) {

    let fileString = NSBundle.mainBundle().pathForResource("audioFile", ofType: "m4a")
    let url = NSURL(fileURLWithPath: fileString)
    var error : NSError?
    audioPlayer = AVAudioPlayer(contentsOfURL: url, error: &error)
    audioPlayer.delegate = self
    audioPlayer.prepareToPlay()
    if (audioPlayer.isEqual(nil)) {
        println("There was an error: (er)")
    } else {
        audioPlayer.play()
        NSLog("working")
    }

私が追加しました import AVFoundationおよびaudioPlayerはグローバル変数です。コードを実行すると、「動作中」と出力されるため、エラーは発生しませんが、音は鳴りません。デバイスはサイレントではありません。

9
Kenneth

コードに非常に多くの問題があるため、ソクラテス式メソッドが機能しなくなります。それを捨ててあなたに見せることはおそらく最も簡単でしょう:

var player : AVAudioPlayer! = nil // will be Optional, must supply initializer

@IBAction func playMyFile(sender: AnyObject?) {
    let path = NSBundle.mainBundle().pathForResource("audioFile", ofType:"m4a")
    let fileURL = NSURL(fileURLWithPath: path)
    player = AVAudioPlayer(contentsOfURL: fileURL, error: nil)
    player.prepareToPlay()
    player.delegate = self
    player.play()
}

私はわざわざエラーチェックをしていませんが、問題があるとクラッシュするという利点があります。

関連する場合と関連しない場合がある最後のポイント:すべてのm4aファイルは再生可能です。たとえば、高度に圧縮されたファイルは、サイレントに失敗する可能性があります(しゃれを意図したもの)。

18
matt

AvPlayerはクラスメンバーであり、指定された関数に含まれていないことが重要です。そうでない場合、スコープ外になります... :)

5
iHolm

これが私のSwiftプロジェクトからの作業スニペットです。 "audiofile"をファイル名に置き換えてください。

    var audioPlayer = AVAudioPlayer()
    let audioPath = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("audiofile", ofType: "mp3"))
    audioPlayer = AVAudioPlayer(contentsOfURL: audioPath, error: nil)
    audioPlayer.delegate = self
    audioPlayer.prepareToPlay()
    audioPlayer.play()

完全に機能するSwiftオーディオプレーヤーアプリケーションのソースコードはここからダウンロードできます https://github.com/bpolat/Music-Player

4
bpolat

何らかの理由(おそらくバグ)Xcodeは、.m4aおよび.mp3形式の特定の音楽ファイルを再生できません。再生するには、すべてを.wavファイルに変更することをお勧めします。

//top of your class
var audioPlayer = AVAudioPlayer

//where you want to play your sound
let Sound = NSURL(fileURLWithPath: Bundle.main.path(forResource: "sound", ofType: "wav")!)
    do {
        audioPlayer = try AVAudioPlayer(contentsOf: Sound as URL)
        audioPlayer.prepareToPlay()
    } catch {
        print("Problem in getting File")
    }
    audioPlayer.play()
1
Anonymous

Swift Try catchを使用したコーディングでは、この問題が解決され、以下のコードでオーディオが再生されます。

var playerVal = AVAudioPlayer()

         @IBAction func btnPlayAction(sender: AnyObject) {
                let fileURL: NSURL = NSURL(string: url)!
                    let soundData = NSData(contentsOfURL: fileURL)

                    do {
                        playerVal = try AVAudioPlayer(data: soundData!)
                    }
                    catch {
                        print("Something bad happened. Try catching specific errors to narrow things down",error)
                    }

                    playerVal.delegate = self
                    playerVal.prepareToPlay()

                    playerVal.play()

              }
0
Iyyappan Ravi

Swift 3.0:

 import UIKit
    import AVFoundation

    class ViewController: UIViewController
    {
        var audioplayer = AVAudioPlayer()

        @IBAction func Play(_ sender: Any)
        {
            audioplayer.play()
        }
        @IBAction func Pause(_ sender: Any)
        {
            if audioplayer.isPlaying
            {
                audioplayer.pause()
            }
            else
            {

            }
        }
        @IBAction func Restart(_ sender: Any)
        {
            if audioplayer.isPlaying
            {
                audioplayer.currentTime = 0
                audioplayer.play()
            }
            else
            {
                audioplayer.play()
            }

        }
        override func viewDidLoad()
        {
            super.viewDidLoad()

            do
            {
                audioplayer = try AVAudioPlayer(contentsOf:URL.init(fileURLWithPath:Bundle.main.path(forResource:"bahubali", ofType: "mp3")!))
                audioplayer.prepareToPlay()

                var audioSession = AVAudioSession.sharedInstance()

                do
                {
                    try audioSession.setCategory(AVAudioSessionCategoryPlayback)
                }

                catch
                {

                }
            }
            catch
            {
                print (error)
            }

        }
     }   
0
ronak patel

私は自分のアプリで以下のコードを使用しましたが、それは機能します。お役に立てば幸いです。

var audioPlayer: AVAudioPlayer!
if var filePath = NSBundle.mainBundle().pathForResource("audioFile", ofType:"mp3"){

     var filePathUrl = NSURL.fileURLWithPath(filePath)
     audioPlayer = AVAudioPlayer(contentsOfURL: filePathUrl, error: nil)
     audioPlayer.play()
}else {
     println("Path for audio file not found")
}
0
Prashanth Ds
var audioPlayer = AVAudioPlayer()
var alertSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("KiepRongBuon", ofType: "mp3")!)
        AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, error: nil)
        AVAudioSession.sharedInstance().setActive(true, error: nil)
        var error:NSError?
        audioPlayer = AVAudioPlayer(contentsOfURL: alertSound, error: &error)
        audioPlayer.prepareToPlay()
        audioPlayer.play()
0
William Kane

@mattの回答に基づいていますが、元の回答では完全に満足できなかったため、少し詳しく説明しました。

import AVFoundation

class YourController: UIViewController {

  private var player : AVAudioPlayer?

  override func viewDidLoad() {
     super.viewDidLoad()

     prepareAudioPlayer()
  }

  @IBAction func playAudio() {

      player?.play()
  }
}

extension YourController: AVAudioPlayerDelegate {}

private extension YourController {

    func prepareAudioPlayer() {

        guard let path = Bundle.main.path(forResource: "you-audio", ofType:"mp3") else {
            return
        }
        let fileURL = URL(fileURLWithPath: path)
        do {
            player = try AVAudioPlayer(contentsOf: fileURL)
        } catch let ex {
            print(ex.localizedDescription)
        }
        player?.prepareToPlay()
        player?.delegate = self
    }
}
0
var audio: AVAudioPlayer = AVAudioPlayer()

@IBAction func playaudio(sender: AnyObject) //method for playing audio
{

    var audioPath = NSString(string: NSBundle.mainBundle().pathForResource("bus",       ofType: "mp3")!)

    var error: NSError? = nil

    //instantiate the player
    audio = AVAudioPlayer(contentsOfURL: NSURL(string: audioPath as String), error: &error)
    audio.prepareToPlay()
    audio.play()
}

override func viewDidLoad() {

    super.viewDidLoad()

    // Do any additional setup after loading the view.
}

そして、AVFoundationFrameworkをインポートすることを忘れないでください。

0
Mehul D