Воспроизведение живой TuneIn Radio URL iOS Swift - PullRequest
0 голосов
/ 11 октября 2018

Я работаю над приложением, которое предназначено для воспроизведения радиостанции с использованием URL-адресов TuneIn.В TuneIn в API есть запрос http get, который предоставляет JSON со всеми URL и битрейтами.

Итак, 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 }] }

Мой первый подход состоял в том, чтобы настроить AVPlayer с одним из указанных URL, но он не воспроизводился,

Кроме того, если вы копируете и вставляете URL-адрес в браузере Chrome, он начинает загружать файл, который занимает вечность.

При проверке с помощью wireshark я наконец обнаружил, что потоковый URL-адрес отличается ион предоставляется с заголовком при первом запросе файла.

Я знаю, что это было сделано на Android путем перехвата заголовков, но возможно ли сделать то же самое на iOS?

Я искал некоторые библиотеки, и MobileVLCKit кажется кандидатом, но не уверен, насколько я рискую, что мое приложение может быть отклонено.

Поскольку потоковая передача очень популярнадействие в настоящее время, могу ли я достичь этого "яблочным путем"

Спасибо

1 Ответ

0 голосов
/ 15 октября 2018

ДЛЯ ВСЕХ, кто хочет потоковую передачу из 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>

И это сработало!

ADDITION

Я также обнаружил, что некоторые ссылкине воспроизводится, особенно те, которые содержат файлы .pls (хотя URL остается прежним).И iOS, и Safari пытаются разрешить их, но есть ошибка, связанная с несовместимостью плагинов.

Я обнаружил, что если я сделаю URL-запрос к URL-адресу, данные возвращаются в виде списка ссылок, разделенных линейными тормозами.

Итак: класс My Connection Helper:

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!
    }

RESULT of String Data:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...