-1
, was ich zu erreichen versuchen:progressive Download mit Authentifizierung und Wiedergabe in schnellen 3
- Progressive Download mit Authentifizierung
- der Lage sein sollten als Teil der Daten kommt (urlSession (_ Sitzung zu spielen : URLSession, dataTask: URLSessionDataTask, didReceive Daten: Daten))
Was i versucht, bis jetzt:
- mit
AVAudioPlayer(data: tempData as Data)
, Versuchte von Daten an die TempData anhängt, da die Daten in URL-Sitzung empfangen. Aber Spieler spielt für den ersten Satz von Daten und stoppt. - Integrierte AVAsset
func initializePlayer() { //audio session for handling interuptions - Done Appdelegate /* 1. Create Asset (Asset represent a single media), AVAsset -> AVAssetTrack 2. Resource properties like metadata, duration etc are loaded from asset, but if taken syncrn will block so use async */ }
let audioPath = Bundle.main.path(forResource: "big_buck_bunny", ofType: "mp4")
let resourceUrl = URL(fileURLWithPath: audioPath!)
let asset = AVAsset(url: resourceUrl)
let playableKey = "playable"
// Load the "playable" property
asset.loadValuesAsynchronously(forKeys: [playableKey]) { [unowned self] in
var error: NSError? = nil
let status = asset.statusOfValue(forKey: playableKey, error: &error)
switch status {
case .loaded:
debugPrint("Sucessfuly loaded")
self.playerItem = AVPlayerItem(asset: asset)
self.playerItem?.addObserver(self, forKeyPath: #keyPath(AVPlayerItem.status), options: [.old, .new], context: &audioPlayerInterfaceViewControllerKVOContext)
self.playerItem?.addObserver(self, forKeyPath: #keyPath(AVPlayerItem.duration), options: [.new, .initial], context: &audioPlayerInterfaceViewControllerKVOContext)
self.player = AVPlayer(playerItem: self.playerItem)
let interval = CMTimeMake(1, 1)
self.timeObserveToken = self.player.addPeriodicTimeObserver(forInterval: interval, queue: DispatchQueue.main) { [unowned self] time in
let timeElapsed = Float(CMTimeGetSeconds(time))
UIView.animate(withDuration: 1.5, animations: {
self.durationSlider.setValue(Float(timeElapsed), animated: true)
})
self.startTimeLabel.text = self.createTimeString(time: timeElapsed)
}
break
// Sucessfully loaded. Continue processing.
case .failed:
self.showErrorAlert(errorString: "Failed to load")
debugPrint("failed")
break
// Handle error
case .cancelled:
self.showErrorAlert(errorString: "Failed to load")
debugPrint("Cancelled")
break
// Terminate processing
default:
debugPrint("Error occured")
self.showErrorAlert(errorString: "Failed to load")
break
// Handle all other cases
}
}
}
erfolgreich gespielt lokale Datei. Aber wie könnten wir den Teil der Daten an AVAsset anhängen, dass ganze Daten abgespielt würden?
Danke, endlich haben wir Streaming-URL. Also jetzt den AVPlayer mit seiner URL-Option verwenden – jobsjobs001
Also ... funktioniert jetzt alles für dich? Ich bin verwirrt von Ihrem Kommentar. –
Ursprünglich war die Anforderung meiner Kunden an 1. Laden Sie die Datei von einer authentifizierten URL herunter, und wenn ein kleiner Datenblock empfangen wird, muss sie abgespielt werden. (nicht Streaming-URL), aber es schien nicht gut zu funktionieren. So erstellt eine URL mit Streaming-Funktionen und eine andere URL zum Download. Mit Hilfe von AVPlayer mit URL wurde das Problem gelöst. Danke – jobsjobs001