Skip to content

Commit 0f38f62

Browse files
authored
feat: 支持设置默认播放速度并且在播放开始时显示当前播放速度 (#130)
1 parent 27fb47f commit 0f38f62

File tree

3 files changed

+52
-1
lines changed

3 files changed

+52
-1
lines changed

BilibiliLive/Component/Player/Plugins/SpeedChangerPlugin.swift

+43-1
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,29 @@
88
import AVKit
99

1010
class SpeedChangerPlugin: NSObject, CommonPlayerPlugin {
11+
private var notifyView: UILabel?
12+
private weak var containerView: UIView?
1113
private weak var player: AVPlayer?
1214
private weak var playerVC: AVPlayerViewController?
1315

1416
@Published private(set) var currentPlaySpeed: PlaySpeed = .default
1517

18+
func addViewToPlayerOverlay(container: UIView) {
19+
containerView = container
20+
}
21+
22+
private func fadeOutNotifyView() {
23+
UIView.animate(withDuration: 1.0, animations: {
24+
self.notifyView?.alpha = 0.0 // Fade out to invisible
25+
}) { _ in
26+
self.notifyView?.removeFromSuperview() // Optionally remove from superview after fading out
27+
}
28+
}
29+
1630
func playerDidLoad(playerVC: AVPlayerViewController) {
1731
self.playerVC = playerVC
32+
33+
currentPlaySpeed = Settings.mediaPlayerSpeed
1834
}
1935

2036
func playerDidChange(player: AVPlayer) {
@@ -25,6 +41,32 @@ class SpeedChangerPlugin: NSObject, CommonPlayerPlugin {
2541
playerVC?.selectSpeed(AVPlaybackSpeed(rate: currentPlaySpeed.value, localizedName: currentPlaySpeed.name))
2642
}
2743

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

@@ -43,7 +85,7 @@ class SpeedChangerPlugin: NSObject, CommonPlayerPlugin {
4385
}
4486
}
4587

46-
struct PlaySpeed {
88+
struct PlaySpeed: Codable {
4789
var name: String
4890
var value: Float
4991
}

BilibiliLive/Component/Settings.swift

+3
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: PlaySpeed.default)
40+
static var mediaPlayerSpeed: PlaySpeed
41+
3942
@UserDefaultCodable("Settings.danmuArea", defaultValue: .style_75)
4043
static var danmuArea: DanmuArea
4144

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.name,
134+
options: PlaySpeed.blDefaults,
135+
optionString: PlaySpeed.blDefaults.map({ $0.name })) {
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)