ios 如何在ios swift中从URL播放mp3音频
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/34563329/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to play mp3 audio from URL in ios swift
提问by Govind
I am getting mp3 url as a response of api calling. I want to play that audio, so how can i do that? (ios swift)
我收到 mp3 url 作为 api 调用的响应。我想播放那个音频,我该怎么做?(ios 快速)
here is my response
这是我的回应
{
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";
}
here is my code::
这是我的代码::
@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")
}
}
where am i going wrong?
我哪里错了?
回答by technerd
Use AVPlayerinstead of AVAudioPlayer to play remote content. As per documentation AVAudioPlayer needs mp3 file to play Audio. AVAudioPlayer not provide support for streaming.
使用AVPlayer代替 AVAudioPlayer 播放远程内容。根据文档 AVAudioPlayer 需要 mp3 文件来播放音频。AVAudioPlayer 不提供流媒体支持。
Try this code , its working fine for me
试试这个代码,它对我来说很好用
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")
}
}
Please keep in mind to set App Transport Security(ATS) in info.plist file.
请记住在 info.plist 文件中设置 App Transport Security(ATS)。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
回答by Satheeshwaran
I tried the following,
我尝试了以下,
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!)
Add the below methods,
添加以下方法,
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()
}
And your play method as it is,
而你的游戏方式,
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")
}
}
Download the mp3 file and then try to play it, somehow AVAudioPlayer does not download your mp3 file for you. I am able to download the audio file and player plays it.
下载 mp3 文件然后尝试播放它,不知何故 AVAudioPlayer 不会为您下载您的 mp3 文件。我可以下载音频文件,然后播放器播放它。
Remember to add this in your info.plist since you are loading from a httpsource and you need the below to be set for iOS 9+
请记住将此添加到您的 info.plist 中,因为您是从http源加载的,并且您需要为iOS 9+设置以下内容
<?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>
回答by Jakub
Since AVPlayer
is very limited (for example you cannot change url
there without regenerate whole AVPlayer
I think you should use AVQueuePlayer
:
由于AVPlayer
非常有限(例如,如果url
不重新生成整体,您就无法在那里进行更改,AVPlayer
我认为您应该使用AVQueuePlayer
:
From the docs:
从文档:
AVQueuePlayer is a subclass of AVPlayer used to play a number of items in sequence. Using this class you can create and manage a queue of player items comprised of local or progressively downloaded file-based media, such as QuickTime movies or MP3 audio files, as well as media served using HTTP Live Streaming.
AVQueuePlayer 是 AVPlayer 的子类,用于按顺序播放多个项目。使用此类,您可以创建和管理由本地或逐步下载的基于文件的媒体(例如 QuickTime 电影或 MP3 音频文件)以及使用 HTTP Live Streaming 提供的媒体组成的播放器项目队列。
So in Swift 3it will work like this:
所以在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()
}
}
回答by oscar castellon
SWIFT 4
快速 4
1 - import AVFoundation
1 - import AVFoundation
2 - declare player
2 - 声明玩家
var player : AVPlayer?
3 - in ViewDidLoad call function and pass the streaming url like String
3 - 在 ViewDidLoad 调用函数中并传递像 String 这样的流媒体 URL
loadRadio(radioURL: (radioStation?.streamURL)!)
4 - function to play
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
}
For me is the best and simply way to streaming audio in swift.
对我来说,这是快速流式传输音频的最佳且简单的方法。
回答by Danilo Lemes
After some research, and some disappointment since none of the answers solved my problem, I've come to a solution and here's the final result. The accepted answer is half right, you still need to create an AVPlayerLayer
经过一些研究,有些失望,因为没有一个答案解决了我的问题,我找到了一个解决方案,这是最终结果。接受的答案对了一半,您仍然需要创建一个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()
回答by Nihas Nazar
var player : AVPlayer?
func playSound()
{
guard let url = URL(string: "https://file-examples.com/wp-content/uploads/2017/11/file_example_MP3_700KB.mp3")
else
{
print("error to get the mp3 file")
return
}
do{
try AVAudioSession.sharedInstance().setCategory(.playback, mode.default)
try AVAudioSession.sharedInstance().setActive(true)
player = try AVPlayer(url: url as URL)
guard let player = player
else
{
return
}
player.play()
} catch let error {
print(error.localizedDescription)
}
}
回答by Sazzad Hissain Khan
Swift 4
斯威夫特 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)")
}
}
回答by Zumry Mohamed
To play a sound in swift2 is
在 swift2 中播放声音是
func playSound(soundUrl: String)
{
let sound = NSURL(soundUrl)
do{
let audioPlayer = try AVAudioPlayer(contentsOfURL: sound)
audioPlayer.prepareToPlay()
audioPlayer.play()
}catch {
print("Error..")
}
}
Let me know if it working.
让我知道它是否有效。