Offline Playback refers to the ability to play downloaded content, although the device doesn’t actually have to be offline (i.e., without network access) to use downloaded assets.
Conceptually, setting up offline playback requires three steps:
- Download the content
- Register the downloaded content with the SDK
- Play the downloaded content.
Download itself is out of scope for this document; it is done either by AVAssetDownloadTask (available in iOS 10 and up) or by a third party download manager.
The main SDK component responsible for local playback is LocalAssetsManager. This class is used before and right after the download to make sure the SDK retrieves DRM licenses for offline playback. It is also used when starting local playback, to link the downloaded content with a MediaEntry object playable by the SDK.
Download and Register
Downloading with AVAssetDownloadTask
When using AVAssetDownloadTask, an application has to create an AVURLAsset and link it to a download task. In addition, if the asset is protected with FairPlay DRM, a delegate on the asset must be set.
Before starting to download, the application should have a ready-to-use MediaEntry object, containing one or more
The application should then call
prepareForDownload(of mediaEntry: MediaEntry) - which will pick the most suitable source for the download and return two values:
- A downloadable
AVURLAsset, configured with FairPlay if required
- The original
MediaSource from which the
AVURLAsset was built.
At this point, the application can start downloading the asset (typically mp4 or HLS).
Downloading with a 3rd-party tool
When the asset isn’t downloadable by AVAssetDownloadTask (or if AVAssetDownloadTask is not available), the download will be done either with a 3rd party tool or by using a URLSessionDownloadTask. In these cases, there’s no “preparation” step; instead, the application calls
getPreferredDownloadableMediaSource(for mediaEntry: MediaEntry) to pick the best source. It then downloads the source, and at the end calls
assetDownloadFinished(mediaSource: MediaSource, location: URL).
This case also applies to Widevine Classic assets.
To play a downloaded asset, the application needs to wrap the asset with a MediaEntry object.
createLocalMediaEntry(for assetId: String, localURL: URL). This function returns a suitable
The constructor of LocalAssetsManager takes an optional LocalDataStore. This object is require if the application downloads or plays DRM-protected content. The protocol has 3 functions:
save(key: String, value: Data)
load(key: String) -> Data
A simple implementation is provided in DefaultLocalDataStore, but if the application has an existing persistent storage facility (such as a CoreData/SQLite db), it might be good idea to provide a different implementation.
Have Questions or Need Help?
Check out the Kaltura Player SDK Forum page for different ways of getting in touch.