Кэшируйте видео HLS во время воспроизведения с помощью AVAssetDownloadTask - PullRequest
0 голосов
/ 02 октября 2019

Я пытаюсь кэшировать поток 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, загрузка начинается, и все делегаты вызывают. Так что загрузка сама по себе работает, но всякий раз, когда я пытаюсь играть, она просто останавливается.

Спасибо за помощь!

Томас

...