播放现场TuneIn广播URL的iOS版雨燕(Playing a live TuneIn Radio

2019-09-29 09:30发布

我的工作其目的是通过使用TuneIn网址玩生活广播的应用程序。 在TuneIn,有一个HTTP GET它提供了一个JSON的所有URL和比特率的API的请求。

所以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检查,我终于发现,流网址是一个不同的,它是提供关于你第一次请求文件的标题。

我知道,已经被截获头在Android上做,但,是可以做同样的iOS上?

我一直在寻找一些图书馆和MobileVLCKit似乎候选人,但不知道如何,我冒着我的应用程序被拒的可能性。

因为,数据流是非常受欢迎的行动如今,我能做到的是,在“苹果方式”

谢谢

Answer 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


文章来源: Playing a live TuneIn Radio URL iOS Swift