#ios #swift #alamofire #avplayer
#iOS #swift #alamofire #avplayer
Вопрос:
Я использую прямую трансляцию с AVPlayer в своем приложении и работает нормально.
Но когда я пытаюсь загрузить какой-либо файл с помощью Alamofire.downlaod method
then stream перестает работать.
rate
Свойство AVPlayer
автоматически равно нулю.
Я думаю, что может быть какая-то проблема с потоковой передачей, но я ее не понимаю.
Мой код выглядит следующим образом
override func viewDidLoad() {
play_Live_Stream()
}
override func viewWillAppear() {
Download_favourite_files()
}
func Download_favourite_files() {
for int i in arr_favourites{
Alamofire.download(urlString, to: destination).response { response in
print(response)
}
}
}
func play_Live_Stream(){
myplayerItem = AVPlayerItem(url: url as! URL)
myPlayer = AVPlayer(playerItem: myplayerItem)
myPlayer.volume = volume_slider.value
PlayerObserving = true
NotificationCenter.default.addObserver(self, selector: #selector(playInstalled(noti:)), name: NSNotification.Name.AVPlayerItemPlaybackStalled, object: myPlayer.currentItem)
NotificationCenter.default.addObserver(self, selector: #selector(playfailed(noti:)), name: NSNotification.Name.AVPlayerItemFailedToPlayToEndTime, object: myPlayer.currentItem)
myPlayer.currentItem?.addObserver(self, forKeyPath: "status", options: NSKeyValueObservingOptions.new, context: nil)
myPlayer.currentItem?.addObserver(self, forKeyPath: "timedMetadata", options: [.new,.old,.initial], context: nil)
myPlayer.currentItem?.addObserver(self, forKeyPath: "playbackLikelyToKeepUp", options: .new, context: nil)
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if ((object! as AnyObject).isEqual(myPlayer.currentItem) amp;amp; keyPath=="status"){
if myPlayer.status == AVPlayerStatus.readyToPlay{
print("ReadyToPlay")
myPlayer.play()
}
}
}
ПОПРОБУЙТЕ 2 (NSURLSession по умолчанию)
func load_downloads(){
for track in arr_tracks{
let urlString = BASE_URL "/track/download/" "(track.id)"
print("downloaded url",urlString)
let url = NSURL(string: urlString)
let downloadTask = backgroundSession.downloadTask(with: url as! URL)
downloadTask.resume()
}
}
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
let destinationURLForFile = documentsURL.appendingPathComponent((downloadTask.originalRequest?.url?.lastPathComponent)! "_" (downloadTask.response?.suggestedFilename)!)
let fileManager = FileManager()
if fileManager.fileExists(atPath: destinationURLForFile.path){
}
else{
do {
try fileManager.moveItem(at: location as URL, to: destinationURLForFile as URL)
}catch{
print("An error occurred while moving file to destination url")
}
}
}
Но это не дает мне никакой информации о том, почему поток остановлен.
Я также наблюдаю остановленную и сбойную информацию, если таковая имеется.
Комментарии:
1. можете ли вы показать реализацию
play_Live_Stream
?2. @RhythmicFistman, я добавил код воспроизведения потока.
3. Сколько файлов вы загружаете одновременно? Вместо того, чтобы запускать все загрузки сразу, можете ли вы попробовать загружать по одной за раз? Возможно, вы перегружаете свое соединение. Наблюдаете ли вы какие-либо изменения в
playbackLikelyToKeepUp
?4. @RhythmicFistman, я загружаю около 5 файлов прямо сейчас. Я не получил никаких изменений
playbackLikelyToKeepUp
. Но я получаю изменения вrate
to0
, поэтому проигрыватель автоматически приостанавливается и никогда не возобновляется снова, даже если загрузка завершена , возможно, вы правы, позвольте мне попробовать загружать по одному.5. @user2526811 Можете ли вы попробовать воспроизвести прямую трансляцию с некоторой задержкой?
Ответ №1:
Попробуйте воспроизвести поток в основном потоке.
DispatchQueue.main.async { [unowned self]
self.play_Live_Stream()
}
Ответ №2:
Попробуйте воспроизвести поток в основном потоке.
DispatchQueue.main.async {
for int i in arr_favourites{
Alamofire.download(urlString, to: destination).response { response in
print(response)
}
}
}