播放现场 TuneIn 电台 URL iOS Swift
Playing a live TuneIn Radio URL iOS Swift
我正在开发一款旨在使用 TuneIn URLs 播放生活电台的应用程序。在 TuneIn 中,API 中有一个 http get 请求,它提供了一个包含所有 URL 及其比特率的 JSON。
所以
http://opml.radiotime.com/Tune.ashx?id=s150147&formats=aac,mp3&render=json
将return
{ "head": { "status": "200"}, "body": [
{ "element" : "audio",
"url": "http://player.absoluteradio.co.uk/tunein.php?i=a664.aac",
"reliability": 95,
"bitrate": 64,
"media_type": "aac",
"position": 0,
"player_width": 529,
"player_height": 716,
"guide_id": "e89279187",
"is_direct": false }, { "element" : "audio",
"url": "http://player.absoluteradio.co.uk/tunein.php?i=a6low.mp3",
"reliability": 78,
"bitrate": 48,
"media_type": "mp3",
"position": 0,
"player_width": 529,
"player_height": 716,
"guide_id": "e89279188",
"is_direct": false }, { "element" : "audio",
"url": "http://player.absoluteradio.co.uk/tunein.php?i=a624.aac",
"reliability": 29,
"bitrate": 24,
"media_type": "aac",
"position": 0,
"player_width": 529,
"player_height": 716,
"guide_id": "e89279186",
"is_direct": false }] }
我的第一种方法是使用给定的 URL 之一设置 AVPlayer,但它没有播放。
此外,如果您在 chrome 浏览器中复制并粘贴 URL,它会开始下载一个需要很长时间的文件。
用wireshark检查,终于发现streaming URL是不同的,它是在你第一次请求文件时用Header提供的。
我知道已经通过拦截 headers 在 android 上完成了,但是,是否可以在 iOS 上做同样的事情?
我一直在寻找一些库,MobileVLCKit 似乎是一个候选者,但不确定我如何冒我的应用程序被拒绝的风险。
因为流媒体是现在非常流行的动作,我可以在 "Apple way"
中实现吗?
谢谢
对于所有想从 TUNEIN 流式传输的人
事实证明,如果您像这样设置 AVPlayer:
class ViewController: UIViewController, AVAssetResourceLoaderDelegate {
let urlFile = URL(string:"http://opml.radiotime.com/Tune.ashx?id=s150147&formats=aac,mp3")!
private var avPlayer:AVPlayer!
private var avAudioSession:AVAudioSession = AVAudioSession.sharedInstance()
override func viewDidLoad() {
super.viewDidLoad()
try! avAudioSession.setCategory(.playback, mode: .default, options: [])
try! avAudioSession.setActive(true)
let audioURLAsset = AVURLAsset(url: urlFile)
//audioURLAsset.resourceLoader.setDelegate(self, queue:DispatchQueue.init(label: "MY QUEUE"))
avPlayer = AVPlayer(playerItem: AVPlayerItem(asset: audioURLAsset))
avPlayer.play()
}
}
它会播放,但您需要在 info.plist
中允许任意加载
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
成功了!
加法
我还发现有些链接无法播放,特别是那些包含 .pls 文件的链接(URL 保持不变)。 iOS 和 safari 都尝试解决它们,但存在有关插件不兼容的错误。
我发现如果我向 URL 发出 URL 请求,返回的数据是一个由线路制动器分隔的链接列表。
所以:
我的连接助手 class:
class URLConnectionHelper: NSObject {
static func getResponse(fromURL url:URL?)->Data?{
guard let url = url else{ return nil }
var result:Data? = nil
let semaphore = DispatchSemaphore(value: 0)
URLSession.shared.dataTask(with: url) { (data, response, error) in
//guard let data = data else{ return nil}
result = data
semaphore.signal()
}.resume()
semaphore.wait()
return result
}
}
并且从 class 调用函数:
guard let dataRadioItem = URLConnectionHelper.getResponse(fromURL: urlFile) else {return}
var urlArray = [URL]()
if let stringData = String(data: dataRadioItem, encoding: String.Encoding.utf8){
print("String Data: \(stringData)")
stringData.enumerateLines { (line, _) -> () in
if let urlLine = URL(string: line){
print("added = \(line)")
urlArray.append(urlLine)
}
}
}
if urlArray.count > 0{
urlFile = urlArray.first!
}
字符串数据的结果:
String Data: http://player.absoluteradio.co.uk/tunein.php?i=a664.aac
http://player.absoluteradio.co.uk/tunein.php?i=a6.mp3
http://player.absoluteradio.co.uk/tunein.php?i=a6low.mp3
http://player.absoluteradio.co.uk/tunein.php?i=a624.aac
我正在开发一款旨在使用 TuneIn URLs 播放生活电台的应用程序。在 TuneIn 中,API 中有一个 http get 请求,它提供了一个包含所有 URL 及其比特率的 JSON。
所以 http://opml.radiotime.com/Tune.ashx?id=s150147&formats=aac,mp3&render=json
将return
{ "head": { "status": "200"}, "body": [
{ "element" : "audio",
"url": "http://player.absoluteradio.co.uk/tunein.php?i=a664.aac",
"reliability": 95,
"bitrate": 64,
"media_type": "aac",
"position": 0,
"player_width": 529,
"player_height": 716,
"guide_id": "e89279187",
"is_direct": false }, { "element" : "audio",
"url": "http://player.absoluteradio.co.uk/tunein.php?i=a6low.mp3",
"reliability": 78,
"bitrate": 48,
"media_type": "mp3",
"position": 0,
"player_width": 529,
"player_height": 716,
"guide_id": "e89279188",
"is_direct": false }, { "element" : "audio",
"url": "http://player.absoluteradio.co.uk/tunein.php?i=a624.aac",
"reliability": 29,
"bitrate": 24,
"media_type": "aac",
"position": 0,
"player_width": 529,
"player_height": 716,
"guide_id": "e89279186",
"is_direct": false }] }
我的第一种方法是使用给定的 URL 之一设置 AVPlayer,但它没有播放。
此外,如果您在 chrome 浏览器中复制并粘贴 URL,它会开始下载一个需要很长时间的文件。
用wireshark检查,终于发现streaming URL是不同的,它是在你第一次请求文件时用Header提供的。
我知道已经通过拦截 headers 在 android 上完成了,但是,是否可以在 iOS 上做同样的事情?
我一直在寻找一些库,MobileVLCKit 似乎是一个候选者,但不确定我如何冒我的应用程序被拒绝的风险。
因为流媒体是现在非常流行的动作,我可以在 "Apple way"
中实现吗?谢谢
对于所有想从 TUNEIN 流式传输的人
事实证明,如果您像这样设置 AVPlayer:
class ViewController: UIViewController, AVAssetResourceLoaderDelegate {
let urlFile = URL(string:"http://opml.radiotime.com/Tune.ashx?id=s150147&formats=aac,mp3")!
private var avPlayer:AVPlayer!
private var avAudioSession:AVAudioSession = AVAudioSession.sharedInstance()
override func viewDidLoad() {
super.viewDidLoad()
try! avAudioSession.setCategory(.playback, mode: .default, options: [])
try! avAudioSession.setActive(true)
let audioURLAsset = AVURLAsset(url: urlFile)
//audioURLAsset.resourceLoader.setDelegate(self, queue:DispatchQueue.init(label: "MY QUEUE"))
avPlayer = AVPlayer(playerItem: AVPlayerItem(asset: audioURLAsset))
avPlayer.play()
}
}
它会播放,但您需要在 info.plist
中允许任意加载<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
成功了!
加法
我还发现有些链接无法播放,特别是那些包含 .pls 文件的链接(URL 保持不变)。 iOS 和 safari 都尝试解决它们,但存在有关插件不兼容的错误。
我发现如果我向 URL 发出 URL 请求,返回的数据是一个由线路制动器分隔的链接列表。
所以: 我的连接助手 class:
class URLConnectionHelper: NSObject {
static func getResponse(fromURL url:URL?)->Data?{
guard let url = url else{ return nil }
var result:Data? = nil
let semaphore = DispatchSemaphore(value: 0)
URLSession.shared.dataTask(with: url) { (data, response, error) in
//guard let data = data else{ return nil}
result = data
semaphore.signal()
}.resume()
semaphore.wait()
return result
}
}
并且从 class 调用函数:
guard let dataRadioItem = URLConnectionHelper.getResponse(fromURL: urlFile) else {return}
var urlArray = [URL]()
if let stringData = String(data: dataRadioItem, encoding: String.Encoding.utf8){
print("String Data: \(stringData)")
stringData.enumerateLines { (line, _) -> () in
if let urlLine = URL(string: line){
print("added = \(line)")
urlArray.append(urlLine)
}
}
}
if urlArray.count > 0{
urlFile = urlArray.first!
}
字符串数据的结果:
String Data: http://player.absoluteradio.co.uk/tunein.php?i=a664.aac
http://player.absoluteradio.co.uk/tunein.php?i=a6.mp3
http://player.absoluteradio.co.uk/tunein.php?i=a6low.mp3
http://player.absoluteradio.co.uk/tunein.php?i=a624.aac