Downloading and playing offline HLS Content - iOS 10

后端 未结 4 462
离开以前
离开以前 2020-12-16 06:01

Since iOS 10, Apple has provided the support for downloading HLS (m3u8) video for offline viewing.

My question is: Is it necessary that we can only download HLS when

相关标签:
4条回答
  • 2020-12-16 06:18

    You can easily download an HLS stream with AVAssetDownloadURLSession makeAssetDownloadTask. Have a look at the AssetPersistenceManager in Apples Sample code: https://developer.apple.com/library/content/samplecode/HLSCatalog/Introduction/Intro.html It should be fairly straight forward to use the Objective C version of the api.

    0 讨论(0)
  • 2020-12-16 06:22

    Yes, you can download video stream served over HLS and watch it later.

    There is a very straight forward sample app (HLSCatalog) from apple on this. The code is fairly simple. you can find it here - https://developer.apple.com/services-account/download?path=/Developer_Tools/FairPlay_Streaming_Server_SDK_v3.1/FairPlay_Streaming_Server_SDK_v3.1.zip

    You can find more about offline HLS streaming here.

    0 讨论(0)
  • 2020-12-16 06:29

    The only way you can do this is to set up an HTTP server to serve the files locally after you've downloaded them.

    The Live playlist uses a sliding-window. You need to periodically reload it after target-duration time and download only the new segments as they appear in the list (they will be removed at a later time).

    Here are some related answers: Can IOS devices stream m3u8 segmented video from the local file system using html5 video and phonegap/cordova?

    0 讨论(0)
  • 2020-12-16 06:33

    I used the apple code guid to download HLS content with the following code:

    var configuration: URLSessionConfiguration?
        var downloadSession: AVAssetDownloadURLSession?
        var downloadIdentifier = "\(Bundle.main.bundleIdentifier!).background"
    
    func setupAssetDownload(videoUrl: String) {
        // Create new background session configuration.
        configuration = URLSessionConfiguration.background(withIdentifier: downloadIdentifier)
    
        // Create a new AVAssetDownloadURLSession with background configuration, delegate, and queue
        downloadSession = AVAssetDownloadURLSession(configuration: configuration!,
                                                    assetDownloadDelegate: self,
                                                    delegateQueue: OperationQueue.main)
    
        if let url = URL(string: videoUrl){
            let asset = AVURLAsset(url: url)
    
            // Create new AVAssetDownloadTask for the desired asset
            let downloadTask = downloadSession?.makeAssetDownloadTask(asset: asset,
                                                                     assetTitle: "Some Title",
                                                                     assetArtworkData: nil,
                                                                     options: nil)
            // Start task and begin download
            downloadTask?.resume()
        }
    }//end method
    
    func urlSession(_ session: URLSession, assetDownloadTask: AVAssetDownloadTask, didFinishDownloadingTo location: URL) {
        // Do not move the asset from the download location
        UserDefaults.standard.set(location.relativePath, forKey: "testVideoPath")
    }
    

    if you don't understand what's going on, read up about it here: https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/MediaPlaybackGuide/Contents/Resources/en.lproj/HTTPLiveStreaming/HTTPLiveStreaming.html

    now you can use the stored HSL content to play the video in AVPlayer with the following code:

    //get the saved link from the user defaults
        let savedLink = UserDefaults.standard.string(forKey: "testVideoPath")
        let baseUrl = URL(fileURLWithPath: NSHomeDirectory()) //app's home directory
        let assetUrl = baseUrl.appendingPathComponent(savedLink!) //append the saved link to home path
    

    now use the path to play video in AVPlayer

    let avAssest = AVAsset(url: assetUrl)
    let playerItem = AVPlayerItem(asset: avAssest)
    let player = AVPlayer(playerItem: playerItem)  // video path coming from above function
    
        let playerViewController = AVPlayerViewController()
        playerViewController.player = player
        self.present(playerViewController, animated: true, completion: {
            player.play()
        })
    
    0 讨论(0)
提交回复
热议问题