web-dev-qa-db-ja.com

iOSのURLからmp3オーディオを再生する方法swift

API呼び出しの応答としてmp3 URLを取得しています。そのオーディオを再生したいのですが、どうすればいいですか? (iosスイフト)

ここに私の応答があります

 {
    content = "En este primer programa se tratar\U00e1n asuntos tan importante como este y aquel sin descuidar un poco de todo lo dem\U00e1s";
    file = "http://radio.spainmedia.es/wp-content/uploads/2015/12/ogilvy.mp3";
    image = "http://radio.spainmedia.es/wp-content/uploads/2015/12/tapas.jpg";
    number = 0001;
    subtitle = Titulareando;
    title = "Tapa 1";
}

ここに私のコードがあります::

 @IBAction func btnplayaudio(sender: AnyObject) {
    let urlstring = "http://radio.spainmedia.es/wp-content/uploads/2015/12/tailtoddle_lo4.mp3"
    let url = NSURL(string: urlstring)
    print("the url = \(url!)")

    play(url!)

}

func play(url:NSURL) {
    print("playing \(url)")

    do {
        self.player = try AVAudioPlayer(contentsOfURL: url)
        player.prepareToPlay()
        player.volume = 1.0
        player.play()
    } catch let error as NSError {
        self.player = nil
        print(error.localizedDescription)
    } catch {
        print("AVAudioPlayer init failed")
    }

}

どこがおかしいの?

16
Govind

私は次を試しました、

    let urlstring = "http://radio.spainmedia.es/wp-content/uploads/2015/12/tailtoddle_lo4.mp3"
    let url = NSURL(string: urlstring)
    print("the url = \(url!)")
    downloadFileFromURL(url!)

以下のメソッドを追加し、

func downloadFileFromURL(url:NSURL){

    var downloadTask:NSURLSessionDownloadTask
    downloadTask = NSURLSession.sharedSession().downloadTaskWithURL(url, completionHandler: { [weak self](URL, response, error) -> Void in
        self?.play(URL)
    })

    downloadTask.resume()

}

そして、あなたのプレイ方法はそのままで、

func play(url:NSURL) {
    print("playing \(url)")

    do {
        self.player = try AVAudioPlayer(contentsOfURL: url)
        player.prepareToPlay()
        player.volume = 1.0
        player.play()
    } catch let error as NSError {
        //self.player = nil
        print(error.localizedDescription)
    } catch {
        print("AVAudioPlayer init failed")
    }

}

Mp3ファイルをダウンロードしてから再生してみてください。どういうわけかAVAudioPlayerはmp3ファイルをダウンロードしません。オーディオファイルをダウンロードでき、プレーヤーで再生できます。

httpソースから読み込んでおり、iOS 9 +に設定するには以下が必要なので、忘れずにinfo.plistに追加してください。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.Apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
</plist>
17
satheeshwaran

リモートコンテンツを再生するには、AVAudioPlayerの代わりに AVPlayer を使用します。ドキュメントによると、AVAudioPlayerはオーディオを再生するためにmp3ファイルを必要とします。 AVAudioPlayerは、 ストリーミング のサポートを提供しません。

このコードを試してください、それは私のためにうまく機能します

func play(url:NSURL) {
    print("playing \(url)")

    do {

        let playerItem = AVPlayerItem(URL: url)

        self.player = try AVPlayer(playerItem:playerItem)
        player!.volume = 1.0
        player!.play()
    } catch let error as NSError {
        self.player = nil
        print(error.localizedDescription)
    } catch {
        print("AVAudioPlayer init failed")
    }
}

Info.plistファイルでApp Transport Security(ATS)を設定することに注意してください。

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>
27
technerd

AVPlayerは非常に限られているため(たとえば、url全体を再生成することなくAVPlayerを変更することはできません)、AVQueuePlayerを使用する必要があります。

docs から:

AVQueuePlayerは、多数のアイテムを順番に再生するために使用されるAVPlayerのサブクラスです。このクラスを使用すると、ローカルまたはプログレッシブにダウンロードされたファイルベースのメディア(QuickTimeムービーやMP3オーディオファイルなど)、およびHTTPライブストリーミングを使用して提供されるメディアで構成されるプレーヤーアイテムのキューを作成および管理できます。

Swift 3では次のように動作します:

lazy var playerQueue : AVQueuePlayer = {
    return AVQueuePlayer()
}()

...

func playTrackOrPlaylist{
    if let url = track.streamURL() { //this is an URL fetch from somewhere. In this if you make sure that URL is valid
        let playerItem = AVPlayerItem.init(url: url)
        self.playerQueue.insert(playerItem, after: nil)
        self.playerQueue.play()
    }
}
7
Jakub

スイフト4

1-import AVFoundation

2-プレイヤーを宣言する

var player : AVPlayer?

3-ViewDidLoad呼び出し関数で、文字列のようなストリーミングURLを渡す

loadRadio(radioURL: (radioStation?.streamURL)!)

4-再生する機能

func loadRadio(radioURL: String) {

        guard let url = URL.init(string: radioURL) else { return }
        let playerItem = AVPlayerItem.init(url: url)
        player = AVPlayer.init(playerItem: playerItem)
        player?.play()
        startNowPlayingAnimation(true)
        played = true
    }

私にとっては、Swiftでオーディオをストリーミングするための最良かつ簡単な方法です。

4
oscar castellon

いくつかの調査と、いずれの答えも私の問題を解決できなかったために失望した後、私は解決策に至りました。最終結果です。受け入れられた答えは半分正しいです、あなたはまだAVPlayerLayerを作成する必要があります

let url = URL(string: "https://www.myinstants.com/media/sounds/cade-o-respeito.mp3" ?? "")
playerItem = AVPlayerItem(url: url!)
player = AVPlayer(playerItem: playerItem)

let playerLayer = AVPlayerLayer(player: player)
playerLayer.frame = CGRect(x: 0, y: 0, width: 10, height: 10)
self.contentView.layoutSublayers(of: playerLayer)

player?.play()
3
Danilo Lemes

Swift 4

func playSound(soundUrl: String) {
    let sound = URL(fileURLWithPath: soundUrl)
    do {
        let audioPlayer = try AVAudioPlayer(contentsOf: sound)
        audioPlayer.prepareToPlay()
        audioPlayer.play()
    }catch let error {
        print("Error: \(error.localizedDescription)")
    }
}
2