Skip to content

Commit 6050ba0

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

File tree

3 files changed

+53
-1
lines changed

3 files changed

+53
-1
lines changed

BilibiliLive/Component/Player/Plugins/SpeedChangerPlugin.swift

+44-1
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,32 @@
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+
currentPlaySpeed = Settings.mediaPlayerSpeed
1835
}
1936

2037
func playerDidChange(player: AVPlayer) {
@@ -25,6 +42,32 @@ class SpeedChangerPlugin: NSObject, CommonPlayerPlugin {
2542
playerVC?.selectSpeed(AVPlaybackSpeed(rate: currentPlaySpeed.value, localizedName: currentPlaySpeed.name))
2643
}
2744

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

@@ -43,7 +86,7 @@ class SpeedChangerPlugin: NSObject, CommonPlayerPlugin {
4386
}
4487
}
4588

46-
struct PlaySpeed {
89+
struct PlaySpeed: Codable {
4790
var name: String
4891
var value: Float
4992
}

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)