Я пытаюсь кэшировать поток HLS во время воспроизведения. Я следовал документации Apple по этому вопросу (раздел «Воспроизведение автономных активов»):
https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/MediaPlaybackGuide/Contents/Resources/en.lproj/HTTPLiveStreaming/HTTPLiveStreaming.html#//apple_ref/doc/uid/TP40016757-CH11-SW1
Я реализовал следующий метод, который должен загружать мои потоки HLS во время воспроизведения:
func downloadAndPlayAsset(_ asset: AVURLAsset) {
// Create new AVAssetDownloadTask for the desired asset
// Passing a nil options value indicates the highest available bitrate should be downloaded
let downloadTask = downloadSession.makeAssetDownloadTask(asset: asset,
assetTitle: assetTitle,
assetArtworkData: nil,
options: nil)!
// Start task
downloadTask.resume()
// Create standard playback items and begin playback
let playerItem = AVPlayerItem(asset: downloadTask.urlAsset)
player = AVPlayer(playerItem: playerItem)
player.play()
}
Проблема в том, что он не загружает видео, а только воспроизводит поток. Я также реализовал делегатов, но потом ни одного из них не вызвали:
func urlSession(_ session: URLSession, assetDownloadTask: AVAssetDownloadTask, didLoad timeRange: CMTimeRange, totalTimeRangesLoaded loadedTimeRanges: [NSValue], timeRangeExpectedToLoad: CMTimeRange)
func urlSession(_ session: URLSession, assetDownloadTask: AVAssetDownloadTask, didFinishDownloadingTo location: URL)
func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?)
Довольно странно, я заметил, что в следующий раз, когда я открываю приложение, assetDownloadURLSession.getAllTasks
возвращает отложенные задачи для моих загрузок изпоследняя сессияТаким образом, он не загружает потоки, но добавляет их в очередь ожидания. Вы знаете, что было бы обоснованием этого? У меня была теория, что загружаемый поток и прямой эфир имеют разное качество, поэтому его нужно повторно загружать с правильным качеством. Поэтому я создал поток HLS для тестирования только с одним качеством, но результат все тот же.
Если я удаляю строки, назначающие AVPlayerItem для AVPlayer, загрузка начинается, и все делегаты вызывают. Так что загрузка сама по себе работает, но всякий раз, когда я пытаюсь играть, она просто останавливается.
Спасибо за помощь!
Томас