Можем ли мы вручную загрузить/кэшировать транспортный поток при потоковой передаче файла m3u8?

Я пытаюсь воспроизвести транспортный поток из файла m3u8. Мое требование состоит в том, чтобы обработать загруженные данные, прежде чем передавать их в AVPlayer. Для этого я использую прокси-сервер [GCDWebserver] для перехвата всех запросов. На прокси-сервере я буду загружать данные, обрабатывать их и возвращать обратно.

Мне удалось загрузить медиафайл, а также попытаться вернуть данные с помощью GCDWebServerDataResponse(data: apiData, contentType: apiResponse.mimeType ?? ""). Но плеер не воспроизводит медиаконтент.

  1. Я использую GCDWebserver в качестве прокси-сервера.

  2. Я создал экземпляр AVPlayerItem со следующим URL-адресом http://34.55.7.151:8080/, который на самом деле мои локальные серверы IP и номер порта.

    /// Инициализировать элемент AVPlayer

    let url = URL(string: "http://10.155.177.151:8080/")!
    let playerItem = AVPlayerItem(url: url)
    player = AVPlayer(playerItem: playerItem)
    player.automaticallyWaitsToMinimizeStalling = false
    
    let playerViewController = AVPlayerViewController()
    playerViewController.player = player
    
    DispatchQueue.main.async {
        self.present(playerViewController, animated: true) {
            playerViewController.player!.play()
        }
    }
    

/// Обработчик HTTP-прокси

    webServer.addDefaultHandler(forMethod: "GET", request: GCDWebServerRequest.self) { (request, completion) in

        let  mediaUrl = URL(string: "http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4")!

        if self.session == nil {
            self.session = URLSession(configuration: URLSessionConfiguration.default)
        }

        let dataTask = self.session?.dataTask(with: mediaUrl, completionHandler: { (data, response, error) in
            if let apiData = data, let apiResponse = response {
                completion(GCDWebServerDataResponse(data: apiData, contentType: apiResponse.mimeType ?? ""))
            } else {
                completion(GCDWebServerDataResponse(text: "Error"))
            }
        })
        dataTask!.resume()
    }

person Akhil    schedule 18.10.2019    source источник
comment
Это похоже на дубликат Возможно ли кэшировать сегменты HLS с помощью AVPlayer?   -  person 0xced    schedule 20.12.2019


Ответы (1)


Нечто подобное реализовано здесь: https://github.com/StyleShare/HLSCachingReverseProxyServer.

Он загружает сегменты во время потоковой передачи, если сегмент доступен локально, он будет использовать его вместо этого.

person Daniel Sirakov    schedule 20.12.2019