下载和播放离线HLS内容 - iOS 10

时间:2016-11-04 13:44:39

标签: ios avplayer hls m3u8 avassetdownloadtask

自iOS 10起,Apple已提供下载HLS(m3u8)视频以供离线观看的支持。

我的问题是:我们是否有必要在播放时只下载HLS?或者我们可以在用户按下载按钮并显示进度时下载。

是否有人在Objective C版本中实现了这一点?实际上我以前的App是在Objective C中制作的。现在我想添加对下载HLS而不是MP4的支持(之前我正在下载MP4用于离线视图)。

我真的很绝望。如果实施,请分享想法或任何代码。

4 个答案:

答案 0 :(得分:2)

我使用苹果代码guid通过以下代码下载HLS内容:

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")
}

如果您不了解发生了什么,请在此处阅读有关内容: https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/MediaPlaybackGuide/Contents/Resources/en.lproj/HTTPLiveStreaming/HTTPLiveStreaming.html

现在您可以使用存储的HSL内容通过以下代码在AVPlayer中播放视频:

//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

现在使用该路径在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()
    })

答案 1 :(得分:1)

您可以执行此操作的唯一方法是设置HTTP服务器,以便在下载文件后在本地提供文件。

直播播放列表使用滑动窗口。您需要在目标持续时间后定期重新加载它,并仅下载列表中显示的新段(它们将在以后删除)。

以下是一些相关答案:IOS设备可以使用html5视频和phonegap / cordova从本地文件系统传输m3u8分段视频吗?

答案 2 :(得分:1)

您可以使用AVAssetDownloadURLSession makeAssetDownloadTask轻松下载HLS流。请查看Apples示例代码中的AssetPersistenceManagerhttps://developer.apple.com/library/content/samplecode/HLSCatalog/Introduction/Intro.html 使用API​​的Objective C版本应该是相当直接的。

答案 3 :(得分:0)

是的,您可以下载通过HLS提供的视频流并稍后观看。

苹果有一个非常简单的示例应用程序(HLSCatalog)。代码非常简单。你可以在这里找到它 - https://developer.apple.com/services-account/download?path=/Developer_Tools/FairPlay_Streaming_Server_SDK_v3.1/FairPlay_Streaming_Server_SDK_v3.1.zip

您可以找到有关离线HLS流媒体here的更多信息。