BMPlayer 1.3.2

BMPlayer 1.3.2

测试已测试
Lang语言 SwiftSwift
许可证 MIT
发布上次发布2020年6月
SPM支持 SPM

BrikerManUgCode 维护。



BMPlayer 1.3.2

BMPlayer

Swift 2.2-5.0 Carthage compatible Version License Platform Weibo FOSSA Status

基于 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与您自己的播放器控制视图一起使用。

演示

gif

参考

此项目大量参考了此项目的Objective-C版本ZFPlayer,感谢ZFPlayer作者的大方帮助。

联系我:

贡献者

欢迎Fork并进行提交拉取请求。

许可协议

BMPlayer遵循MIT许可协议。详情请参阅LICENSE文件。

FOSSA Status