5 Replies
      Latest reply on May 23, 2018 1:30 PM by fsdkhjfsdjkfsdhjk243
      giuscapo Level 1 Level 1 (0 points)

        Hi everyone!


        I'm developing an application that will show a stream video feed (Instagram like feed) and I was thinking about how to make it.

        Actually I am using a CollectionViewController and instantiating AVPlayers inside each cell.

        I'm also managing pause/resume task on scroll view scrolling.


        Videos come from cdn and are m3u8 format (for HLS).

        When I play with

        let player = AVPlayer(url: videoURL)

        Everything works good.


        But what I really need is to cache this video in order to improve performance and reactivity.


        I tried with AVAssetDownloadURLSession, following this guide https://developer.apple.com/library/content/documentation/AudioVideo/Conceptual/MediaPlaybackGuide/Contents/Resources/en.lproj/HTTPLiveStreaming/HTTPLiveStreaming.html


        Strange behavior: the first time I launched the app, it worked! Now, it does not.

        I also found out that downloading is not monitored (print (percentageComplete) does not work!)


        This is the code I used:

        func setupAssetDownload(url:URL) {
                let configuration = URLSessionConfiguration.background(withIdentifier: "streamVideo")
                let downloadSession = AVAssetDownloadURLSession(configuration: configuration,
                                                            assetDownloadDelegate: self,
                                                            delegateQueue: OperationQueue.main)
                let asset = AVURLAsset(url: url)
                let downloadTask = downloadSession.makeAssetDownloadTask(asset: asset,
                                                                         assetTitle: "",
                                                                         assetArtworkData: nil,
                                                                         options: nil)
            func urlSession(_ session: URLSession, assetDownloadTask: AVAssetDownloadTask, didLoad timeRange: CMTimeRange, totalTimeRangesLoaded loadedTimeRanges: [NSValue], timeRangeExpectedToLoad: CMTimeRange) {
                var percentComplete = 0.0
                for value in loadedTimeRanges {
                    let loadedTimeRange = value.timeRangeValue
                    percentComplete += loadedTimeRange.duration.seconds / timeRangeExpectedToLoad.duration.seconds
                percentComplete *= 100
                print("Percent complete \(percentComplete)")
            func urlSession(_ session: URLSession, assetDownloadTask: AVAssetDownloadTask, didFinishDownloadingTo location: URL) {
                UserDefaults.standard.set(location.relativePath, forKey: "assetPath")


        What's wrong with this code?


        Thanks for your help, it's very urgent!