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

7
自iOS10以来,苹果提供了支持下载HLS(m3u8)视频进行离线查看的功能。
我的问题是:我们只能在播放时下载HLS吗?还是我们只需在用户按下下载按钮时下载并显示进度条。
有没有人在Objective C版本中实现了这个功能?实际上,我之前的应用程序是用Objective C制作的。现在我想添加对下载HLS的支持,而不是MP4(之前我正在下载MP4进行离线查看)。
我真的很渴望这样做。如果已经实现,请分享您的想法或任何代码。

你如何在iOS 10中下载HLS以供离线观看? - Rhythmic Fistman
@NSPratik,你能告诉我如何播放离线HLS加密视频吗?我在https://dev59.com/H6Tia4cB1Zd3GeqP_lDY#45957045找到了一些信息,但是还无法解决问题。 - Amrit Tiwari
@AmritTiwari 看看这个:https://dev59.com/LZzha4cB1Zd3GeqPBji1#54493233 - AfnanAhmad
@AfnanAhmad 我已经做了同样的事情,但是下载单个视频文件可以正常工作,但我想下载 .ts 文件。 - Amrit Tiwari
@AmritTiwari 我没有使用过 .ts 文件。你能提供一个这样的文件链接,这样我就可以测试并查看哪里出了问题吗? - AfnanAhmad
显示剩余2条评论
4个回答

5
我使用了苹果代码指南中的代码下载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()
    })

2

唯一的方法是在下载后设置一个HTTP服务器来本地提供文件。

直播播放列表使用滑动窗口。你需要在目标时间间隔后定期重新加载它,并仅下载列表中出现的新片段(它们将在稍后删除)。

以下是一些相关答案:iOS设备是否可以使用HTML5视频和PhoneGap / Cordova从本地文件系统流式传输m3u8分段视频?


1

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接