FWPlayer
基于 AVPlayer 的一个适用于 iOS 的视频播放器 SDK。
特性
- 支持横竖屏播放
- 支持自动旋转屏幕播放
- 支持全屏和迷你播放器播放
- 支持拖动迷你播放器位置
- 支持网络和本地视频播放
- 支持全屏锁定
- 支持下载时播放(媒体缓存)
- 支持在屏幕左侧垂直滑动调整亮度
- 支持在屏幕右侧垂直滑动调整音量
- 支持手势快速前进和后退
- 支持拖动滑块快速前进和后退
- 支持直接跳转到时间线上的一个点进行播放
- 支持多种视频格式
- 支持 UITableView 播放
- 支持 UICollectionView 播放
- 支持 UIScrollView 播放
- 支持后台播放
- 支持静音模式播放声音
- 支持变速播放(0.5x, 1.0x, 1.25x, 1.5x, 2.0x)
- 支持自定义播放器视图
- 支持广告视图
- 支持向 AVURLAsset 添加 Http 头和其他选项
- 由于 iOS 12 中已弃用 OpenGL ES,因此不支持 FFmpeg。
要求
- iOS 9+
- Xcode 10.2.1+
安装
您可以以多种方式安装FWPlayer SDK
CocoaPods
CocoaPods 是安装FWPlayer的一个简单方法。
- 将以下项添加到您的
Podfile
platform :ios, '9.0'
target 'Your App' do
pod 'FWPlayer'
end
- 然后,执行以下命令
$ pod install
- 切换到
构建阶段
并通过点击编辑器左上角的+
添加一个新运行脚本阶段
。添加以下命令以解决 App Store 提交问题。
bash "${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/FWPlayerCore.framework/strip-frameworks.sh"
Carthage
由于FWPlayer SDK是作为二进制文件散发的,您需要在您的 Cartfile
中使用自定义 binary
规则。
- 将以下内容添加到您的
Cartfile
binary "https://raw.githubusercontent.com/FoksWang/FWPlayer/master/Carthage/FWPlayer.json" ~> 1.0.7
- 通过运行以下命令获取框架
$ carthage update --platform iOS
手动安装
- 将FWPlayer框架添加到您的目标的
嵌入式二进制文件
FWPlayerCore.framework
- 确保您链接以下
链接框架和库
FWPlayerCore.framework
使用
正常样式
Objective-C
FWAVPlayerManager *playerManager = [[FWAVPlayerManager alloc] init];
self.player = [FWPlayerController playerWithPlayerManager:playerManager containerView:self.containerView];
self.player.controlView = self.controlView;
Swift
private var player: FWPlayerController?
private lazy var containerView: UIImageView = {
let imageView = UIImageView()
imageView.setImageWithURLString(coverImageUrl, placeholder: UIImage(named: "placeholder"))
return imageView
}()
private lazy var controlView: FWPlayerControlView = {
let view = FWPlayerControlView()
view.fastViewAnimated = true
view.autoHiddenTimeInterval = 5.0
view.autoFadeTimeInterval = 0.5
view.prepareShowLoading = true
view.prepareShowControlView = true
return view
}()
let playerManager = FWAVPlayerManager()
playerManager.isEnableMediaCache = false
// Setup player
self.player = FWPlayerController(playerManager: playerManager, containerView: self.containerView)
self.player?.controlView = self.controlView
// Setup continue playing in the background
self.player?.pauseWhenAppResignActive = true
self.player?.orientationWillChange = { [weak self] (player, isFullScreen) in
self?.setNeedsStatusBarAppearanceUpdate()
}
// Finished playing
self.player?.playerDidToEnd = { [weak self] (asset) in
guard let strongSelf = self else {
return
}
strongSelf.player?.currentPlayerManager.replay!()
strongSelf.player?.playTheNext()
if strongSelf.player?.isLastAssetURL == false {
strongSelf.controlView.showTitle("Video Title", coverURLString: strongSelf.kVideoCover, fullScreenMode: .landscape)
} else {
strongSelf.player?.stop()
}
}
self.player?.assetURLs = self.assetURLs
要播放下一个或上一个视频,只需设置
Objective-C
self.player.assetURLs = self.assetURLs;
Swift
self.player!.assetURLs = self.assetURLs
- 要播放下一个视频,请调用方法
playTheNext
- 要播放上一个视频,请调用方法
playThePrevious
- 要播放资产列表中的视频,请调用方法
playTheIndex:index
例如,播放下一个视频
Objective-C
if (!self.player.isLastAssetURL) {
[self.player playTheNext];
[self.controlView showTitle:@"Video title" coverURLString:kVideoCover fullScreenMode:FWFullScreenModeAutomatic];
} else {
NSLog(@"No more videos");
}
Swift
if self.player!.isLastAssetURL == false {
self.player!.playTheNext()
self.controlView.showTitle("Video title", coverURLString: kVideoCover, fullScreenMode: .automatic)
} else {
print("No more videos")
}
列表样式
Objective-C
FWAVPlayerManager *playerManager = [[FWAVPlayerManager alloc] init];
self.player = [FWPlayerController playerWithScrollView:self.tableView playerManager:playerManager containerViewTag:tag];
self.player.controlView = self.controlView;
Swift
let playerManager = FWAVPlayerManager()
self.player = FWPlayerController(scrollView: tableView, playerManager: playerManager, containerViewTag: tag)
self.player!.controlView = self.controlView
- 您的自定义播放器管理器必须符合
FWPlayerMediaPlayback
协议。 - 您的自定义控制视图必须符合
FWPlayerMediaControl
协议。
如果视频旋转,必须在 ViewController 中实现
Objective-C
- (BOOL)shouldAutorotate {
return player.shouldAutorotate;
}
Swift
override var shouldAutorotate: Bool {
return self.player?.shouldAutorotate ?? false
}
在下载时使用回放(媒体缓存)
回放时下载(媒体缓存)
函数不支持 m3u8,通常用于 MP4。
- 设置
isEnableMediaCache
Objective-C
playerManager.isEnableMediaCache = YES;
Swift
playerManager.isEnableMediaCache = true
- 在您的
Info.plist
中设置NSAppTransportSecurity
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
演示
屏幕截图
视频
参考文献
- https://github.com/Bilibili/ijkplayer
- https://github.com/changsanjiang/SJVideoPlayer
- https://github.com/renzifeng/ZFPlayer
- https://github.com/vitoziv/VIMediaCache
- https://github.com/ChangbaDevs/KTVHTTPCache
作者
(Foks)王辉, [email protected]
许可证
FWPlayer根据MIT许可证提供。有关更多信息,请参阅LICENSE文件。