CachingPlayerItem is a subclass of AVPlayerItem that lets you stream and cache media content on iOS. Initial idea for this work was found here.
CachingPlayerItemDelegate
delegateCachingPlayerItem
is a subclass of AVPlayerItem
, so you can use it in the same manner as AVPlayerItem
and take the full advantage of AVFoundation
FrameworkCachingPlayerItemConfiguration
CachingPlayerItemDelegate
CocoaPods is a dependency manager for Cocoa projects. You can install it with the following command:
$ gem install cocoapods
To integrate CachingPlayerItem into your Xcode project using CocoaPods, specify it in your Podfile
:
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '10.0'
use_frameworks!
target '<Your Target Name>' do
pod 'CachingPlayerItem'
end
The Swift Package Manager is a tool for automating the distribution of Swift code and is integrated into the swift
compiler.
Once you have your Swift package set up, adding CachingPlayerItem
as a dependency is as easy as adding it to the dependencies
value of your Package.swift
.
dependencies: [
.package(url: "https://github.com/sukov/CachingPlayerItem.git", from: "1.0.5")
]
import UIKit
import AVFoundation
import CachingPlayerItem
class ViewController: UIViewController {
// You need to keep a strong reference to your player.
var player: AVPlayer!
override func viewDidLoad() {
super.viewDidLoad()
let url = URL(string: "https://random-url.com/video.mp4")!
let playerItem = CachingPlayerItem(url: url)
player = AVPlayer(playerItem: playerItem)
player.automaticallyWaitsToMinimizeStalling = false
player.play()
}
}
From Apple docs: It's strongly recommended to set AVPlayer's property automaticallyWaitsToMinimizeStalling
to false
. Not doing so can lead to poor startup times for playback and poor recovery from stalls.
If you want to cache a file without playing it, or to preload it for future playing, use download()
method:
let playerItem = CachingPlayerItem(url: videoURL)
playerItem.download()
It's fine to start playing the item while it's being downloaded.
Note: All of the methods are optional.
@objc public protocol CachingPlayerItemDelegate {
// MARK: Downloading delegate methods
/// Called when the media file is fully downloaded.
@objc optional func playerItem(_ playerItem: CachingPlayerItem, didFinishDownloadingFileAt filePath: String)
/// Called every time a new portion of data is received.
@objc optional func playerItem(_ playerItem: CachingPlayerItem, didDownloadBytesSoFar bytesDownloaded: Int, outOf bytesExpected: Int)
/// Called on downloading error.
@objc optional func playerItem(_ playerItem: CachingPlayerItem, downloadingFailedWith error: Error)
// MARK: Playing delegate methods
/// Called after initial prebuffering is finished, means we are ready to play.
@objc optional func playerItemReadyToPlay(_ playerItem: CachingPlayerItem)
/// Called when the player is unable to play the data/url.
@objc optional func playerItemDidFailToPlay(_ playerItem: CachingPlayerItem, withError error: Error?)
/// Called when the data being downloaded did not arrive in time to continue playback.
@objc optional func playerItemPlaybackStalled(_ playerItem: CachingPlayerItem)
}
Important: You are in charge for managing the downloaded local media files. In case you used an initializer that generates the filePath randomly, you will be able to retrieve it in didFinishDownloadingFileAt
delegate method.
To run the example project, clone the repo, and run pod install
from the Example directory first.
sukov, [email protected]
CachingPlayerItem is available under the MIT license. See the LICENSE file for more info.
let playerItem = CachingPlayerItem(url: url, customFileExtension: "mp3")
.link |
Stars: 22 |
Last commit: 2 days ago |
Swiftpack is being maintained by Petr Pavlik | @ptrpavlik | @swiftpackco | API | Analytics