BMPlayer
基于 AVPlayer 的 iOS 视频播放器,支持横屏和竖屏播放,支持通过滑动调整音量、亮度和快进、快退,支持字幕。
功能
- 支持横屏和竖屏播放模式
- 支持播放在线 URL 和本地文件
- 通过屏幕左侧的垂直滑动调整亮度
- 通过屏幕右侧的垂直滑动调整音量
- 通过水平滑动实现快进和快退
- 支持多分辨率视频
- 自定义播放速率
- 添加 Http 头部和其他选项到 AVURLAsset
- 易于定制
- 支持显示本地和在线字幕
- Swift 5
要求
- iOS 10.0+
- Xcode 10.0+
- Swift 4
安装
CocoaPods
Swift | podfile |
---|---|
Swift 5.0 | pod 'BMPlayer', '~> 1.3.0' |
Swift 4.2 | pod 'BMPlayer', '~> 1.2.0' |
Swift 4.0 | pod 'BMPlayer', '~> 1.0.0' |
Swift 3.0 | pod 'BMPlayer', '~> 0.9.1' |
Swift 2.2 | pod 'BMPlayer', '~> 0.3.3' |
要测试实验性的缓存支持与VIMediaCache,请使用
pod 'BMPlayer/CacheSupport', :git => 'https://github.com/BrikerMan/BMPlayer.git'
Carthage
在Cartfile中添加BMPlayer
。
github "BrikerMan/BMPlayer"
运行carthage以构建框架,并将构建好的BMPlayer.framework拖入你的Xcode项目中。
示例
在运行示例之前,在Example
文件夹中运行pod install
。
使用(支持IB和代码)
设置状态栏颜色
请在info.plist中添加基于视图控制器的外观状态栏
字段,并将其更改为NO
IB 使用
直接拖拽 IB 到 UIView,满足16:9的约束比例(优先级750,低于1000行),代码段仅需要实现。更多细节见演示。
import BMPlayer
player.playWithURL(URL(string: url)!)
player.backBlock = { [unowned self] (isFullScreen) in
if isFullScreen == true { return }
let _ = self.navigationController?.popViewController(animated: true)
}
SnapKit 实现的代码
由import BMPlayer
player = BMPlayer()
view.addSubview(player)
player.snp.makeConstraints { (make) in
make.top.equalTo(self.view).offset(20)
make.left.right.equalTo(self.view)
// Note here, the aspect ratio 16:9 priority is lower than 1000 on the line, because the 4S iPhone aspect ratio is not 16:9
make.height.equalTo(player.snp.width).multipliedBy(9.0/16.0).priority(750)
}
// Back button event
player.backBlock = { [unowned self] (isFullScreen) in
if isFullScreen == true { return }
let _ = self.navigationController?.popViewController(animated: true)
}
设置视频 URL
let asset = BMPlayerResource(url: URL(string: "http://baobab.wdjcdn.com/14525705791193.mp4")!,
name: "风格互换:原来你我相爱")
player.setVideo(resource: asset)
多码率视频带有封面
let res0 = BMPlayerResourceDefinition(url: URL(string: "http://baobab.wdjcdn.com/1457162012752491010143.mp4")!,
definition: "高清")
let res1 = BMPlayerResourceDefinition(url: URL(string: "http://baobab.wdjcdn.com/1457162012752491010143.mp4")!,
definition: "标清")
let asset = BMPlayerResource(name: "周末号外丨中国第一高楼",
definitions: [res0, res1],
cover: URL(string: "http://img.wdjimg.com/image/video/447f973848167ee5e44b67c8d4df9839_0_0.jpeg"))
player.setVideo(resource: asset)
为请求添加 HTTP 头部
let header = ["User-Agent":"BMPlayer"]
let options = ["AVURLAssetHTTPHeaderFieldsKey":header]
let definition = BMPlayerResourceDefinition(url: URL(string: "http://baobab.wdjcdn.com/1457162012752491010143.mp4")!,
definition: "高清",
options: options)
let asset = BMPlayerResource(name: "Video Name",
definitions: [definition])
监听播放器状态变化
更多详情见示例项目
封堵
//Listen to when the player is playing or stopped
player?.playStateDidChange = { (isPlaying: Bool) in
print("playStateDidChange \(isPlaying)")
}
//Listen to when the play time changes
player?.playTimeDidChange = { (currentTime: TimeInterval, totalTime: TimeInterval) in
print("playTimeDidChange currentTime: \(currentTime) totalTime: \(totalTime)")
}
委托
protocol BMPlayerDelegate {
func bmPlayer(player: BMPlayer ,playerStateDidChange state: BMPlayerState) { }
func bmPlayer(player: BMPlayer ,loadedTimeDidChange loadedDuration: TimeInterval, totalDuration: TimeInterval) { }
func bmPlayer(player: BMPlayer ,playTimeDidChange currentTime : TimeInterval, totalTime: TimeInterval) { }
func bmPlayer(player: BMPlayer ,playerIsPlaying playing: Bool) { }
}
自定义播放器
在播放器分配之前需要更改。
// should print log, default false
BMPlayerConf.allowLog = false
// should auto play, default true
BMPlayerConf.shouldAutoPlay = true
// main tint color, default whiteColor
BMPlayerConf.tintColor = UIColor.whiteColor()
// options to show header view (which include the back button, title and definition change button) , default .Always,options: .Always, .HorizantalOnly and .None
BMPlayerConf.topBarShowInCase = .Always
// loader type, see detail:https://github.com/ninjaprox/NVActivityIndicatorView
BMPlayerConf.loaderType = NVActivityIndicatorType.BallRotateChase
// enable setting the brightness by touch gesture in the player
BMPlayerConf.enableBrightnessGestures = true
// enable setting the volume by touch gesture in the player
BMPlayerConf.enableVolumeGestures = true
// enable setting the playtime by touch gesture in the player
BMPlayerConf.enablePlaytimeGestures = true
高级自定义
- 通过扩展
BMPlayerControlView
来创建您自己的控制UI,参考示例。 - 使用
BMPlayerLayer
与您自己的播放器控制视图一起使用。
演示
参考
此项目大量参考了此项目的Objective-C版本ZFPlayer,感谢ZFPlayer作者的大方帮助。
联系我:
- 博客: https://eliyar.biz
- 电子邮件: [email protected]
贡献者
欢迎Fork并进行提交拉取请求。
许可协议
BMPlayer遵循MIT许可协议。详情请参阅LICENSE文件。