播放现场 TuneIn Radio URL iOS Swift

Posted

技术标签:

【中文标题】播放现场 TuneIn Radio URL iOS Swift【英文标题】:Playing a live TuneIn Radio URL iOS Swift 【发布时间】:2018-10-11 07:09:42 【问题描述】:

我正在开发一个应用程序,该应用程序旨在通过使用 TuneIn URL 播放生活广播。在 TuneIn 中,API 中有一个 http get 请求,它提供了一个包含所有 URL 及其比特率的 JSON。

所以 http://opml.radiotime.com/Tune.ashx?id=s150147&formats=aac,mp3&render=json

会回来

 "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。

我知道这已经在 android 上通过拦截标头完成了,但是,是否可以在 ios 上做同样的事情?

我一直在寻找一些库,MobileVLCKit 似乎是一个候选者,但不确定我如何冒着我的应用被拒绝的风险。

既然现在流媒体是非常流行的动作,我能否以“苹果方式”实现这一点

谢谢

【问题讨论】:

【参考方案1】:

所有想要从 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 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

    


并且从类中调用函数:

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 Radio URL iOS Swift的主要内容,如果未能解决你的问题,请参考以下文章

控制 mp3 流的缓冲区

使用 phonegap 播放流直播 url aac+ 流

AVPlayer 无法在 iOS 9 上播放

如何在 iOS 中按下按钮播放广播电台

UITableView 视差标题滚动动画(TuneIn)

为体系结构“i386”选择了不受支持的编译器“GCC 4.2”