Skip to content

Commit 07269c8

Browse files
committed
feat: 支持设置默认播放速度并且在播放开始时显示当前播放速度
1 parent 27fb47f commit 07269c8

File tree

3 files changed

+100
-0
lines changed

3 files changed

+100
-0
lines changed

BilibiliLive/Component/Player/Plugins/SpeedChangerPlugin.swift

+46
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,35 @@
66
//
77

88
import AVKit
9+
// import NotificationBannerSwift
910

1011
class SpeedChangerPlugin: NSObject, CommonPlayerPlugin {
12+
private var notifyView: UILabel?
13+
private weak var containerView: UIView?
1114
private weak var player: AVPlayer?
1215
private weak var playerVC: AVPlayerViewController?
1316

1417
@Published private(set) var currentPlaySpeed: PlaySpeed = .default
1518

19+
func addViewToPlayerOverlay(container: UIView) {
20+
containerView = container
21+
}
22+
23+
private func fadeOutNotifyView() {
24+
UIView.animate(withDuration: 1.0, animations: {
25+
self.notifyView?.alpha = 0.0 // Fade out to invisible
26+
}) { _ in
27+
self.notifyView?.removeFromSuperview() // Optionally remove from superview after fading out
28+
}
29+
}
30+
1631
func playerDidLoad(playerVC: AVPlayerViewController) {
1732
self.playerVC = playerVC
33+
34+
let filteredItems = PlaySpeed.blDefaults.filter { $0.value == Settings.mediaPlayerSpeed.speed }
35+
if !filteredItems.isEmpty {
36+
currentPlaySpeed = filteredItems[0]
37+
}
1838
}
1939

2040
func playerDidChange(player: AVPlayer) {
@@ -25,6 +45,32 @@ class SpeedChangerPlugin: NSObject, CommonPlayerPlugin {
2545
playerVC?.selectSpeed(AVPlaybackSpeed(rate: currentPlaySpeed.value, localizedName: currentPlaySpeed.name))
2646
}
2747

48+
func playerDidStart(player: AVPlayer) {
49+
if notifyView == nil {
50+
notifyView = UILabel()
51+
notifyView?.backgroundColor = UIColor.black.withAlphaComponent(0.3)
52+
notifyView?.textColor = UIColor.white
53+
containerView?.addSubview(notifyView!)
54+
notifyView?.numberOfLines = 0
55+
notifyView?.layer.cornerRadius = 10 // Set the corner radius
56+
notifyView?.layer.masksToBounds = true // Enable masks to bounds
57+
notifyView?.font = UIFont.systemFont(ofSize: 26)
58+
notifyView?.textAlignment = NSTextAlignment.center
59+
notifyView?.snp.makeConstraints { make in
60+
// make.bottom.equalToSuperview().inset(20) // 20 points from the bottom
61+
make.center.equalToSuperview() // Center horizontally
62+
make.width.equalTo(300) // Set a width (optional)
63+
make.height.equalTo(60) // Set a height (optional)
64+
}
65+
}
66+
notifyView?.isHidden = false
67+
notifyView?.text = "播放速度设置为 \(currentPlaySpeed.name)"
68+
69+
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
70+
self.fadeOutNotifyView()
71+
}
72+
}
73+
2874
func addMenuItems(current: inout [UIMenuElement]) -> [UIMenuElement] {
2975
let gearImage = UIImage(systemName: "gearshape")
3076

BilibiliLive/Component/Settings.swift

+48
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ enum Settings {
3636
@UserDefaultCodable("Settings.mediaQuality", defaultValue: .quality_1080p)
3737
static var mediaQuality: MediaQualityEnum
3838

39+
@UserDefaultCodable("Settings.mediaPlayerSpeed", defaultValue: .speed_100)
40+
static var mediaPlayerSpeed: MediaPlayerSpeed
41+
3942
@UserDefaultCodable("Settings.danmuArea", defaultValue: .style_75)
4043
static var danmuArea: DanmuArea
4144

@@ -236,3 +239,48 @@ extension MediaQualityEnum {
236239
}
237240
}
238241
}
242+
243+
enum MediaPlayerSpeed: Codable, CaseIterable {
244+
case speed_050
245+
case speed_075
246+
case speed_100
247+
case speed_125
248+
case speed_150
249+
case speed_200
250+
}
251+
252+
extension MediaPlayerSpeed {
253+
var desp: String {
254+
switch self {
255+
case .speed_050:
256+
return "0.5X"
257+
case .speed_075:
258+
return "0.75X"
259+
case .speed_100:
260+
return "1X"
261+
case .speed_125:
262+
return "1.25X"
263+
case .speed_150:
264+
return "1.5X"
265+
case .speed_200:
266+
return "2X"
267+
}
268+
}
269+
270+
var speed: Float {
271+
switch self {
272+
case .speed_050:
273+
return 0.5
274+
case .speed_075:
275+
return 0.75
276+
case .speed_100:
277+
return 1.0
278+
case .speed_125:
279+
return 1.25
280+
case .speed_150:
281+
return 1.5
282+
case .speed_200:
283+
return 2.0
284+
}
285+
}
286+
}

BilibiliLive/Module/Personal/SettingsViewController.swift

+6
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,12 @@ class SettingsViewController: UIViewController {
129129
optionString: MediaQualityEnum.allCases.map({ $0.desp })) {
130130
Settings.mediaQuality = $0
131131
}
132+
Actions(title: "默认播放速度", message: "默认设置为1.0",
133+
current: Settings.mediaPlayerSpeed.desp,
134+
options: MediaPlayerSpeed.allCases,
135+
optionString: MediaPlayerSpeed.allCases.map({ $0.desp })) {
136+
Settings.mediaPlayerSpeed = $0
137+
}
132138
Toggle(title: "Avc优先(卡顿尝试开启)", setting: Settings.preferAvc, onChange: Settings.preferAvc.toggle())
133139
Toggle(title: "无损音频和杜比全景声", setting: Settings.losslessAudio, onChange: Settings.losslessAudio.toggle())
134140
Toggle(title: "匹配视频内容", setting: Settings.contentMatch, onChange: Settings.contentMatch.toggle())

0 commit comments

Comments
 (0)