Commit b593bc69 authored by Alex朱枝文's avatar Alex朱枝文

播放器优化生命周期,优化播放器分配、优化小窗

parent 65cd18a7
......@@ -277,7 +277,10 @@ extension YHLifeViewController: UICollectionViewDelegate, UICollectionViewDataSo
return
}
let item = self.viewModel.liveArr[indexPath.row]
YHPlayerManager.shared.enterLive(from: nil, id: item.id, url: item.pull_url, title: item.live_title, roomId: item.room_id)
// YHPlayerManager.shared.enterLive(from: nil, id: item.id, url: item.pull_url, title: item.live_title, roomId: item.room_id)
//let url = "https://pull-flv-l13.douyincdn.com/stage/stream-116307521507688888_ld5.flv?expire=1733728207&sign=cef0df720ef0dbe3126675d72dcacec2&major_anchor_level=common&abr_pts=-800&_session_id=037-2024120215100750CB84D802B8201D3D81.1733123408338.51633&rsi=1"
let playbackInfo = YHPlayerManager.PlaybackInfo(id: item.id, url: item.pull_url, title: item.live_title, roomId: item.room_id, isLive: true, scene: .fullscreen)
YHPlayerManager.shared.enterLive(from: nil, playbackInfo: playbackInfo)
}
}
......
......@@ -141,7 +141,8 @@ extension YHHomeBannerView: FSPagerViewDataSource, FSPagerViewDelegate {
// // TODO: - alex测试
// if index == 1 {
// let cell: YHHomeBannerCollectionViewCell? = pagerView.cellForItem(at: index) as? YHHomeBannerCollectionViewCell
// YHPlayerManager.shared.enterLive(from: cell?.bannerImagV, id: 23, url: "https://pull-flv-l6.douyincdn.com/stage/stream-116295918585905183.flv?k=e21f1ae1e7591521&t=1733551151&major_anchor_level=common&abr_pts=-800&_session_id=037-202411301359108030CAEAC1F742805E6D.1732946351732.18942&rsi=1", title: nil, roomId: nil, type: .secondary)
// let playbackInfo = YHPlayerManager.PlaybackInfo(id: 40, url: "https://pull-flv-l13.douyincdn.com/stage/stream-116307521507688888_ld5.flv?expire=1733728207&sign=cef0df720ef0dbe3126675d72dcacec2&major_anchor_level=common&abr_pts=-800&_session_id=037-2024120215100750CB84D802B8201D3D81.1733123408338.51633&rsi=1", title: nil, roomId: nil, isLive: true, scene: .fullscreen)
// YHPlayerManager.shared.enterLive(from: cell?.bannerImagV, playbackInfo: playbackInfo)
// return
// }
// // TODO: - alex测试
......@@ -223,16 +224,19 @@ extension YHHomeBannerView: FSPagerViewDataSource, FSPagerViewDelegate {
// video_url 视频链接
// recorded_cate_id 录播分类id
let cell: YHHomeBannerCollectionViewCell? = pagerView.cellForItem(at: index) as? YHHomeBannerCollectionViewCell
YHPlayerManager.shared.enterLive(from: cell?.bannerImagV, id: model.live_id, url: model.live_pull_url, title: nil, roomId: nil, type: .secondary)
let playbackInfo = YHPlayerManager.PlaybackInfo(id: model.live_id, url: model.live_pull_url, title: nil, roomId: nil, isLive: true, scene: .fullscreen)
YHPlayerManager.shared.enterLive(from: cell?.bannerImagV, playbackInfo: playbackInfo)
printLog("跳转直播")
case 101://录播
printLog("跳转录播")
let cell: YHHomeBannerCollectionViewCell? = pagerView.cellForItem(at: index) as? YHHomeBannerCollectionViewCell
YHPlayerManager.shared.enterVOD(from: cell?.bannerImagV, id: model.live_id, url: model.video_url, title: nil, type: .secondary)
let playbackInfo = YHPlayerManager.PlaybackInfo(id: model.live_id, url: model.video_url, title: nil, roomId: nil, isLive: false, scene: .fullscreen)
YHPlayerManager.shared.enterVOD(from: cell?.bannerImagV, playbackInfo: playbackInfo)
case 102://图片直播
printLog("跳转录播")
let cell: YHHomeBannerCollectionViewCell? = pagerView.cellForItem(at: index) as? YHHomeBannerCollectionViewCell
YHPlayerManager.shared.enterLive(from: cell?.bannerImagV, id: model.live_id, url: model.live_pull_url, title: nil, roomId: nil, type: .secondary)
let playbackInfo = YHPlayerManager.PlaybackInfo(id: model.live_id, url: model.live_pull_url, title: nil, roomId: nil, isLive: true, scene: .fullscreen)
YHPlayerManager.shared.enterLive(from: cell?.bannerImagV, playbackInfo: playbackInfo)
case 0://0 不需要跳转
printLog("0 不需要跳转")
default:
......@@ -266,7 +270,10 @@ extension YHHomeBannerView: FSPagerViewDataSource, FSPagerViewDelegate {
// // TODO: - alex测试
// if let cell = cell as? YHHomeBannerCollectionViewCell {
// if index == 1 {
// YHPlayerManager.shared.play(url: "https://pull-flv-l11.douyincdn.com/thirdgame/stream-404525958790382412.flv?expire=1733554587&sign=d1e9f927e20f4a3fb4e2dd2a2712e256&major_anchor_level=common&abr_pts=-800&_session_id=037-20241130145626DBDEB00EB11CB388DD95.1732949787574.66743&rsi=1", inView: cell.bannerImagV, title: nil, type: .secondary)
//
// let playbackInfo = YHPlayerManager.PlaybackInfo(id: 40, url: "https://pull-flv-l13.douyincdn.com/stage/stream-116307521507688888_ld5.flv?expire=1733728207&sign=cef0df720ef0dbe3126675d72dcacec2&major_anchor_level=common&abr_pts=-800&_session_id=037-2024120215100750CB84D802B8201D3D81.1733123408338.51633&rsi=1", title: nil, roomId: nil, isLive: true, scene: .banner)
// YHPlayerManager.shared.enterBanner(playbackInfo: playbackInfo, inView: cell.bannerImagV)
//
// } else {
// let player = YHPlayerManager.shared.getPlayer(.secondary)
// player?.setPlayView(nil)
......@@ -276,8 +283,10 @@ extension YHHomeBannerView: FSPagerViewDataSource, FSPagerViewDelegate {
// // TODO: - alex测试
if model.skip_url.isEmpty == false {
if let cell = cell as? YHHomeBannerCollectionViewCell {
if model.skip_type == 100 {
if model.skip_type == 100 || model.skip_type == 102 {
YHPlayerManager.shared.play(url: model.live_pull_url, inView: cell.bannerImagV, title: nil, type: .secondary)
let playbackInfo = YHPlayerManager.PlaybackInfo(id: model.live_id, url: model.live_pull_url, title: nil, roomId: nil, isLive: true, scene: .banner)
YHPlayerManager.shared.enterBanner(playbackInfo: playbackInfo, inView: cell.bannerImagV)
} else {
let player = YHPlayerManager.shared.getPlayer(.secondary)
player?.setPlayView(nil)
......@@ -302,7 +311,7 @@ extension YHHomeBannerView: FSPagerViewDataSource, FSPagerViewDelegate {
// }
// // TODO: - alex测试
if model.skip_url.isEmpty == false {
if model.skip_type == 100 {
if model.skip_type == 100 || model.skip_type == 102 {
YHPlayerManager.shared.stop(type: .secondary)
}
}
......
......@@ -94,7 +94,8 @@ extension YHSelectLookView: UICollectionViewDelegate, UICollectionViewDataSource
return
}
let item = items[indexPath.row]
YHPlayerManager.shared.enterLive(from: nil, id: item.id, url: item.pull_url, title: item.live_title, roomId: item.room_id)
let playbackInfo = YHPlayerManager.PlaybackInfo(id: item.id, url: item.pull_url, title: item.live_title, roomId: item.room_id, isLive: true, scene: .fullscreen)
YHPlayerManager.shared.enterLive(from: nil, playbackInfo: playbackInfo)
}
}
......
......@@ -31,9 +31,17 @@ class YHPlayer {
weak var currentPlayView: UIView?
private(set) var currentTitle: String?
var isMuted: Bool {
get { playerKit.getMute() }
set { playerKit.mute(newValue) }
}
init(type: YHPlayerType, playerKit: AgoraRtcMediaPlayerProtocol) {
self.type = type
self.playerKit = playerKit
// 基础设置
playerKit.setLoopCount(-1) // 循环播放
}
func setPlayView(_ view: UIView?) {
......@@ -47,7 +55,10 @@ class YHPlayer {
let mediaSource = AgoraMediaSource()
mediaSource.url = url
mediaSource.autoPlay = true
playerKit.open(with: mediaSource)
let result = playerKit.open(with: mediaSource)
if result == 0 {
playerKit.play()
}
}
func stop() {
......@@ -65,6 +76,17 @@ class YHPlayer {
playerKit.play()
}
func reset() {
stop()
setPlayView(nil)
delegate = nil
}
func releasePlayer() {
reset()
//playerKit.destroy()
}
func getPosition() -> Int {
return playerKit.getPosition()
}
......
......@@ -13,6 +13,7 @@ import AgoraRtcKit
class YHVODPlayerViewController: YHBasePlayerViewController {
// MARK: - Properties
private let vodId: Int
var startPosition: Int = 0
//private let viewModel = YHVideoViewModel()
// MARK: - Initialization
......
......@@ -75,7 +75,7 @@ class YHFloatingWindow: NSObject {
let container = UIView(frame: CGRect(x: 0, y: 0, width: 30, height: 30))
container.backgroundColor = .clear
container.addSubview(closeButton)
closeButton.center = CGPoint(x: container.bounds.width/2, y: container.bounds.height/2)
closeButton.center = CGPoint(x: container.bounds.width / 2, y: container.bounds.height / 2)
return container
}()
......@@ -110,7 +110,7 @@ class YHFloatingWindow: NSObject {
contentView.leadingAnchor.constraint(equalTo: containerView.leadingAnchor),
contentView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor),
contentView.topAnchor.constraint(equalTo: containerView.topAnchor),
contentView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor)
contentView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor),
])
containerView.addSubview(closeButtonContainer)
......@@ -119,7 +119,7 @@ class YHFloatingWindow: NSObject {
closeButtonContainer.topAnchor.constraint(equalTo: containerView.topAnchor),
closeButtonContainer.trailingAnchor.constraint(equalTo: containerView.trailingAnchor),
closeButtonContainer.widthAnchor.constraint(equalToConstant: 30),
closeButtonContainer.heightAnchor.constraint(equalToConstant: 30)
closeButtonContainer.heightAnchor.constraint(equalToConstant: 30),
])
}
......@@ -198,46 +198,6 @@ class YHFloatingWindow: NSObject {
}
}
private func snapToNearestSize() {
let currentWidth = containerView.bounds.width
let sizeSteps: [CGFloat] = [
Size.minWidth,
Size.maxWidth * 0.33,
Size.maxWidth * 0.5,
Size.maxWidth * 0.75,
Size.maxWidth
]
var targetWidth = sizeSteps[0]
var minDifference = abs(currentWidth - targetWidth)
for size in sizeSteps {
let difference = abs(currentWidth - size)
if difference < minDifference {
minDifference = difference
targetWidth = size
}
}
let targetHeight = targetWidth / videoOrientation.aspectRatio
let centerX = containerView.center.x
let centerY = containerView.center.y
UIView.animate(withDuration: 0.3,
delay: 0,
options: [.curveEaseOut],
animations: {
var frame = self.containerView.frame
frame.size = CGSize(width: targetWidth, height: targetHeight)
frame.origin.x = centerX - targetWidth / 2
frame.origin.y = centerY - targetHeight / 2
self.containerView.frame = frame
self.delegate?.floatingWindow(self, didChangeSize: frame.size)
})
}
// MARK: - Gesture Handlers
@objc private func handlePan(_ gesture: UIPanGestureRecognizer) {
......@@ -267,42 +227,109 @@ class YHFloatingWindow: NSObject {
}
}
private func snapToNearestSize() {
guard let superview = containerView.superview else { return }
let currentWidth = containerView.bounds.width
let screenWidth = superview.bounds.width
let screenHeight = superview.bounds.height
// 简化尺寸档位,且确保不超过屏幕宽度的75%
let maxAllowedWidth = min(Size.maxWidth, screenWidth * 0.75)
let sizeSteps: [CGFloat] = [
Size.minWidth,
Size.defaultWidth,
maxAllowedWidth * 0.5,
maxAllowedWidth,
]
// 找到最接近的宽度
let targetWidth = sizeSteps.min(by: { abs($0 - currentWidth) < abs($1 - currentWidth) }) ?? Size.defaultWidth
let targetHeight = targetWidth / videoOrientation.aspectRatio
// 确保高度不超过屏幕高度的75%
let maxAllowedHeight = screenHeight * 0.75
let finalWidth: CGFloat
let finalHeight: CGFloat
if targetHeight > maxAllowedHeight {
finalHeight = maxAllowedHeight
finalWidth = finalHeight * videoOrientation.aspectRatio
} else {
finalWidth = targetWidth
finalHeight = targetHeight
}
UIView.animate(withDuration: 0.3) {
var frame = self.containerView.frame
// 设置新的尺寸
frame.size = CGSize(width: finalWidth, height: finalHeight)
// 计算新的中心点,确保不超出屏幕边界
let centerX = max(finalWidth / 2, min(self.containerView.center.x, screenWidth - finalWidth / 2))
let centerY = max(finalHeight / 2, min(self.containerView.center.y, screenHeight - finalHeight / 2))
// 基于新的中心点设置origin
frame.origin.x = centerX - finalWidth / 2
frame.origin.y = centerY - finalHeight / 2
self.containerView.frame = frame
self.delegate?.floatingWindow(self, didChangeSize: frame.size)
}
}
@objc private func handlePinch(_ gesture: UIPinchGestureRecognizer) {
guard let superview = containerView.superview else { return }
switch gesture.state {
case .began:
isResizing = true
initialFrame = containerView.frame
currentScale = 1.0
let touch1 = gesture.location(ofTouch: 0, in: containerView)
let touch2 = gesture.location(ofTouch: 1, in: containerView)
initialDistance = hypot(touch2.x - touch1.x, touch2.y - touch1.y)
case .changed:
let touch1 = gesture.location(ofTouch: 0, in: containerView)
let touch2 = gesture.location(ofTouch: 1, in: containerView)
let currentDistance = hypot(touch2.x - touch1.x, touch2.y - touch1.y)
let scale = gesture.scale
let screenWidth = superview.bounds.width
let screenHeight = superview.bounds.height
let scale = (currentDistance / initialDistance) * scaleMultiplier
let scaleDelta = scale / currentScale
currentScale = scale
// 计算新的尺寸
var newWidth = initialFrame.width * scale
var newHeight = newWidth / videoOrientation.aspectRatio
let newWidth = initialFrame.width * scaleDelta
let newHeight = newWidth / videoOrientation.aspectRatio
// 确保不超过屏幕最大限制(75%的屏幕大小)
let maxWidth = screenWidth * 0.75
let maxHeight = screenHeight * 0.75
var newFrame = initialFrame
newFrame.size = constrainSize(CGSize(width: newWidth, height: newHeight))
if newWidth > maxWidth {
newWidth = maxWidth
newHeight = newWidth / videoOrientation.aspectRatio
}
let centerX = containerView.center.x
let centerY = containerView.center.y
newFrame.origin.x = centerX - newFrame.width / 2
newFrame.origin.y = centerY - newFrame.height / 2
if newHeight > maxHeight {
newHeight = maxHeight
newWidth = newHeight * videoOrientation.aspectRatio
}
CATransaction.begin()
CATransaction.setDisableActions(true)
containerView.frame = newFrame
CATransaction.commit()
// 确保不小于最小尺寸
if newWidth < Size.minWidth {
newWidth = Size.minWidth
newHeight = newWidth / videoOrientation.aspectRatio
}
// 保持中心点不变,但确保不超出屏幕边界
var newCenter = containerView.center
// 约束中心点,确保视图不会超出屏幕
newCenter.x = max(newWidth / 2, min(newCenter.x, screenWidth - newWidth / 2))
newCenter.y = max(newHeight / 2, min(newCenter.y, screenHeight - newHeight / 2))
// 更新frame
var newFrame = containerView.frame
newFrame.size = CGSize(width: newWidth, height: newHeight)
newFrame.origin.x = newCenter.x - newWidth / 2
newFrame.origin.y = newCenter.y - newHeight / 2
containerView.frame = newFrame
delegate?.floatingWindow(self, didChangeSize: newFrame.size)
case .ended, .cancelled:
......
......@@ -104,9 +104,9 @@ class YHMyViewController: YHBaseViewController, ConstraintRelatableTarget {
self.navigationController?.pushViewController(vc)
// let url = "https://pull-flv-l11.douyincdn.com/thirdgame/stream-116296425803875148.flv?expire=1733558990&sign=cc69d0ac884efe3613385140611c1702&major_anchor_level=common&abr_pts=-800&_session_id=037-2024113016095034A5715FA5656D873A69.1732954190959.73911&rsi=1"
// YHPlayerManager.shared.enterLive(from: nil, id: 23, url: url)
// let url = "https://pull-flv-l13.douyincdn.com/stage/stream-116307521507688888_ld5.flv?expire=1733728207&sign=cef0df720ef0dbe3126675d72dcacec2&major_anchor_level=common&abr_pts=-800&_session_id=037-2024120215100750CB84D802B8201D3D81.1733123408338.51633&rsi=1"
// let playbackInfo = YHPlayerManager.PlaybackInfo(id: 40, url: url, isLive: true, scene: .fullscreen)
// YHPlayerManager.shared.enterLive(from: nil, playbackInfo: playbackInfo)
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment