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

首页小窗以及banner

parent 5516b476
......@@ -28,10 +28,15 @@ class YHHomePageViewController: YHBaseViewController {
var homeHeaderViewHeight : CGFloat = 0.0
private var isGoYHManagerFlag : Bool = false
private var didShowFloating : Bool = false
var configModel: YHHomeInfoModel? {
didSet {
homeHeaderView.kingModel = configModel?.king_kong_list ?? []
if let live_info = configModel?.live_info {
setupLiveFloating(liveInfo: live_info)
}
}
}
......@@ -112,6 +117,16 @@ class YHHomePageViewController: YHBaseViewController {
//MARK: - 私有方法
private extension YHHomePageViewController {
private func setupLiveFloating(liveInfo: YHHomeLiveInfoModel) {
printLog("#####setupLiveFloating(liveInfo: YHHomeLiveInfoModel) ")
guard !didShowFloating else {
return
}
didShowFloating = true
let playbackInfo = YHPlayerManager.PlaybackInfo(id: liveInfo.id, token: liveInfo.token, channelId: liveInfo.rtmp_channel, uid: UInt(liveInfo.id), isLive: true, scene: .floating, playerType: .main)
YHPlayerManager.shared.enterFloating(from: nil, playbackInfo: playbackInfo)
}
func gotoMgrVC() {
if self.isGoYHManagerFlag {
return
......
......@@ -288,7 +288,7 @@ extension YHLifeViewController: UICollectionViewDelegate, UICollectionViewDataSo
return
}
let item = self.viewModel.liveArr[indexPath.row]
let playbackInfo = YHPlayerManager.PlaybackInfo(id: item.id, url: item.pull_url, title: item.live_title, roomId: item.room_id, uid: UInt(item.id), isLive: true, scene: .fullscreen)
let playbackInfo = YHPlayerManager.PlaybackInfo(id: item.id, url: nil, title: item.live_title, roomId: item.room_id, uid: UInt(item.id), isLive: true, scene: .fullscreen)
YHPlayerManager.shared.enterLive(from: nil, playbackInfo: playbackInfo)
}
}
......
......@@ -25,11 +25,8 @@ class YHHomeBannerView: UIView {
// 指定显示图片为第一个
bannerView.selectItem(at: 0, animated: false)
let noNeedAutoScroll = dataArr.contains(where: {
$0.skip_type == 100 || $0.skip_type == 102
$0.skip_type == 100
})
// // TODO: - alex测试
// noNeedAutoScroll = true
// // TODO: - alex测试
// 开启定时器开始滚动
bannerView.automaticSlidingInterval = noNeedAutoScroll ? 0 : bannerSildingInterval
bannerView.removesInfiniteLoopForSingleItem = true
......@@ -146,14 +143,6 @@ extension YHHomeBannerView: FSPagerViewDataSource, FSPagerViewDelegate {
if model.isLocalItemFlag {
return
}
// // TODO: - alex测试
// if index == 1 {
// let cell: YHHomeBannerCollectionViewCell? = pagerView.cellForItem(at: index) as? YHHomeBannerCollectionViewCell
// let playbackInfo = YHPlayerManager.PlaybackInfo(id: 40, url: "https://pull-flv-f1-admin.douyincdn.com/thirdgame/stream-7443723341506054922_md.flv?keeptime=00093a80&wsSecret=cf2c048a5bceb7669e37b229e807c0e2&wsTime=674d82e7&major_anchor_level=common&abr_pts=-800&select_mode=score&_session_id=037-2024120217503167B9DF9F03DF6401DE50.1733133032147.26047&rsi=1", title: nil, roomId: nil, isLive: true, scene: .fullscreen)
// YHPlayerManager.shared.enterLive(from: cell?.bannerImagV, playbackInfo: playbackInfo)
// return
// }
// // TODO: - alex测试
switch model.skip_type {
case 1: //跳转H5
if model.skip_url.isEmpty == false {
......@@ -249,6 +238,10 @@ extension YHHomeBannerView: FSPagerViewDataSource, FSPagerViewDelegate {
return
}
let cell: YHHomeBannerCollectionViewCell? = pagerView.cellForItem(at: index) as? YHHomeBannerCollectionViewCell
if let player = YHPlayerManager.shared.getPlayer(.secondary) {
YHPlayerManager.shared.leaveChannel(for: player)
player.clearPlayerView()
}
let playbackInfo = YHPlayerManager.PlaybackInfo(id: model.live_id, url: model.live_pull_url, title: nil, roomId: nil, token: model.token, channelId: model.rtmp_channel, uid: UInt(model.live_id), isLive: true, scene: .fullscreen)
YHPlayerManager.shared.enterLive(from: cell?.bannerImagV, playbackInfo: playbackInfo)
printLog("跳转直播")
......@@ -257,6 +250,10 @@ extension YHHomeBannerView: FSPagerViewDataSource, FSPagerViewDelegate {
if !checkLogin() {
return
}
if let player = YHPlayerManager.shared.getPlayer(.secondary) {
player.stop()
player.clearPlayerView()
}
let cell: YHHomeBannerCollectionViewCell? = pagerView.cellForItem(at: index) as? YHHomeBannerCollectionViewCell
let playbackInfo = YHPlayerManager.PlaybackInfo(id: model.recorded_video_id, url: model.video_url, title: nil, roomId: nil, uid: nil, isLive: false, scene: .fullscreen)
YHPlayerManager.shared.enterVOD(from: cell?.bannerImagV, playbackInfo: playbackInfo)
......@@ -265,6 +262,10 @@ extension YHHomeBannerView: FSPagerViewDataSource, FSPagerViewDelegate {
if !checkLogin() {
return
}
if let player = YHPlayerManager.shared.getPlayer(.secondary) {
YHPlayerManager.shared.leaveChannel(for: player)
player.clearPlayerView()
}
let cell: YHHomeBannerCollectionViewCell? = pagerView.cellForItem(at: index) as? YHHomeBannerCollectionViewCell
let playbackInfo = YHPlayerManager.PlaybackInfo(id: model.live_id, url: model.live_pull_url, title: nil, roomId: nil, token: model.token, channelId: model.rtmp_channel, uid: UInt(model.live_id), isLive: true, scene: .fullscreen)
YHPlayerManager.shared.enterLive(from: cell?.bannerImagV, playbackInfo: playbackInfo)
......@@ -294,33 +295,17 @@ extension YHHomeBannerView: FSPagerViewDataSource, FSPagerViewDelegate {
if model.isLocalItemFlag {
return
}
// // TODO: - alex测试
// if let cell = cell as? YHHomeBannerCollectionViewCell {
// if index == 1 {
//
// let playbackInfo = YHPlayerManager.PlaybackInfo(id: 40, url: "https://pull-flv-f1-admin.douyincdn.com/thirdgame/stream-7443723341506054922_md.flv?keeptime=00093a80&wsSecret=cf2c048a5bceb7669e37b229e807c0e2&wsTime=674d82e7&major_anchor_level=common&abr_pts=-800&select_mode=score&_session_id=037-2024120217503167B9DF9F03DF6401DE50.1733133032147.26047&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)
// }
// return
// }
// // TODO: - alex测试
if model.skip_url.isEmpty == false {
if let cell = cell as? YHHomeBannerCollectionViewCell {
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)
player?.clearPlayerView()
if let cell = cell as? YHHomeBannerCollectionViewCell {
if model.skip_type == 100 {
let playbackInfo = YHPlayerManager.PlaybackInfo(id: model.live_id, token: model.token, channelId: model.rtmp_channel, uid: UInt(model.live_id), isLive: true, scene: .banner, playerType: .secondary)
YHPlayerManager.shared.enterBanner(playbackInfo: playbackInfo, inView: cell.bannerImagV)
} else {
if let player = YHPlayerManager.shared.getPlayer(.secondary) {
YHPlayerManager.shared.leaveChannel(for: player)
player.clearPlayerView()
}
}
}
}
......@@ -332,15 +317,13 @@ extension YHHomeBannerView: FSPagerViewDataSource, FSPagerViewDelegate {
if model.isLocalItemFlag {
return
}
// // TODO: - alex测试
// if index == 1 {
// YHPlayerManager.shared.stop(type: .secondary)
// return
// }
// // TODO: - alex测试
if model.skip_url.isEmpty == false {
if model.skip_type == 100 || model.skip_type == 102 {
YHPlayerManager.shared.stop(type: .secondary)
if let player = YHPlayerManager.shared.getPlayer(.secondary) {
YHPlayerManager.shared.leaveChannel(for: player)
player.clearPlayerView()
}
}
}
}
......
......@@ -118,7 +118,7 @@ extension YHSelectLookView: UICollectionViewDelegate, UICollectionViewDataSource
return
}
let item = items[indexPath.row]
let playbackInfo = YHPlayerManager.PlaybackInfo(id: item.id, url: item.pull_url, title: item.live_title, roomId: item.room_id, uid: UInt(item.id), isLive: true, scene: .fullscreen)
let playbackInfo = YHPlayerManager.PlaybackInfo(id: item.id, url: nil, title: item.live_title, roomId: item.room_id, uid: UInt(item.id), isLive: true, scene: .fullscreen)
YHPlayerManager.shared.enterLive(from: nil, playbackInfo: playbackInfo)
}
}
......
......@@ -16,7 +16,7 @@ class YHMainChannelDelegate: NSObject, AgoraRtcEngineDelegate {
weak var player: YHPlayer?
func rtcEngine(_ engine: AgoraRtcEngineKit, didJoinChannel channel: String, withUid uid: UInt, elapsed: Int) {
printLog("main channel: local user join room \(channelId ?? ""): \(uid) \(elapsed)ms")
printLog("$$$$###main channel: local user join room \(channelId ?? ""): \(uid) \(elapsed)ms")
}
func rtcEngine(_ engine: AgoraRtcEngineKit, didJoinedOfUid uid: UInt, elapsed: Int) {
......@@ -24,7 +24,7 @@ class YHMainChannelDelegate: NSObject, AgoraRtcEngineDelegate {
let player = player,
let view = player.currentPlayView else { return }
printLog("main channel: remote user join room \(channelId): \(uid) \(elapsed)ms")
printLog("$$$$###main channel: remote user join room \(channelId): \(uid) \(elapsed)ms")
let videoCanvas = AgoraRtcVideoCanvas()
videoCanvas.uid = uid
......@@ -34,7 +34,7 @@ class YHMainChannelDelegate: NSObject, AgoraRtcEngineDelegate {
}
func rtcEngine(_ engine: AgoraRtcEngineKit, didOfflineOfUid uid: UInt, reason: AgoraUserOfflineReason) {
printLog("main channel: remote user left: \(uid) reason \(reason)")
printLog("$$$$###main channel: remote user left: \(uid) reason \(reason)")
let videoCanvas = AgoraRtcVideoCanvas()
videoCanvas.uid = uid
......@@ -42,6 +42,17 @@ class YHMainChannelDelegate: NSObject, AgoraRtcEngineDelegate {
videoCanvas.renderMode = .hidden
engine.setupRemoteVideo(videoCanvas)
}
func rtcEngine(_ engine: AgoraRtcEngineKit, videoSizeChangedOf sourceType: AgoraVideoSourceType, uid: UInt, size: CGSize, rotation: Int) {
printLog("$$$$###videoSizeChangedOf: \(size)")
if let player = player {
player.delegate?.player(player, didReceiveVideoSize: size)
}
}
func rtcEngine(_ engine: AgoraRtcEngineKit, firstRemoteVideoFrameOfUid uid: UInt, size: CGSize, elapsed: Int) {
printLog("$$$$###firstRemoteVideoFrameOfUid: \(size)")
}
}
class YHSecondaryChannelDelegate: NSObject, AgoraRtcEngineDelegate {
......@@ -86,4 +97,15 @@ class YHSecondaryChannelDelegate: NSObject, AgoraRtcEngineDelegate {
connection.localUid = player.currentUid ?? 0
engine.setupRemoteVideoEx(videoCanvas, connection: connection)
}
func rtcEngine(_ engine: AgoraRtcEngineKit, videoSizeChangedOf sourceType: AgoraVideoSourceType, uid: UInt, size: CGSize, rotation: Int) {
printLog("$$$$###videoSizeChangedOf: \(size)")
if let player = player {
player.delegate?.player(player, didReceiveVideoSize: size)
}
}
func rtcEngine(_ engine: AgoraRtcEngineKit, firstRemoteVideoFrameOfUid uid: UInt, size: CGSize, elapsed: Int) {
printLog("###firstRemoteVideoFrameOfUid: \(size)")
}
}
......@@ -369,7 +369,20 @@ class YHPlayerManager: NSObject {
func enterFloating(from viewController: UIViewController? = nil, playbackInfo: PlaybackInfo) {
guard let window = UIApplication.shared.yhKeyWindow() else { return }
guard floatingWindow == nil else {
return
}
let isCurrentFromLive = viewController is YHLivePlayerViewController
let isCurrentFromVod = viewController is YHVODPlayerViewController
if !isCurrentFromLive, !isCurrentFromVod, let topVC = UIApplication.shared.yhKeyWindow()?.rootViewController?.topMostViewController() {
// 如果当前顶部控制器是播放器页面,则不创建浮窗
if topVC is YHLivePlayerViewController || topVC is YHVODPlayerViewController {
return
}
}
let playerType = determinePlayerType(for: .floating)
let player: YHPlayer = player(for: playerType)
......@@ -390,6 +403,7 @@ class YHPlayerManager: NSObject {
floatingWindow.playbackInfo = updatedInfo
floatingWindow.delegate = self
floatingWindow.player = player
player.delegate = floatingWindow
self.floatingWindow = floatingWindow
// 添加截图视图到窗口
......@@ -441,10 +455,12 @@ class YHPlayerManager: NSObject {
floatingWindow.player = player
floatingWindow.playbackInfo = updatedInfo
self.floatingWindow = floatingWindow
player.delegate = floatingWindow
// 检查是否存在当前播放器
if let token = playbackInfo.token,
let channelId = playbackInfo.channelId,
let uid = playbackInfo.uid, !token.isEmpty, !channelId.isEmpty {
leaveChannel(for: player)
joinChannel(for: player, token: token, channelId: channelId, uid: uid, view: floatingWindow.contentView)
} else if let url = playbackInfo.url, !url.isEmpty {
player.play(url: url, title: playbackInfo.title, view: floatingWindow.contentView)
......@@ -476,7 +492,12 @@ class YHPlayerManager: NSObject {
// 加入频道
if let token = playbackInfo.token,
let channelId = playbackInfo.channelId, let uid = playbackInfo.uid, !token.isEmpty, !channelId.isEmpty {
joinChannel(for: player, token: token, channelId: channelId, uid: uid, view: view)
if player.isJoined {
leaveChannel(for: player)
joinChannel(for: player, token: token, channelId: channelId, uid: uid, view: view)
} else {
joinChannel(for: player, token: token, channelId: channelId, uid: uid, view: view)
}
} else if let url = playbackInfo.url, !url.isEmpty {
player.play(url: url, title: playbackInfo.title, view: view)
}
......
......@@ -6,6 +6,7 @@
// Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
//
import AgoraRtcKit
import UIKit
// MARK: - 浮窗管理
......@@ -187,15 +188,66 @@ class YHFloatingWindow: NSObject {
// MARK: - Private Methods
private func updateLayoutForOrientation() {
let currentWidth = containerView.bounds.width
let newHeight = currentWidth / videoOrientation.aspectRatio
UIView.animate(withDuration: 0.3) {
var frame = self.containerView.frame
frame.size.height = newHeight
self.containerView.frame = frame
self.delegate?.floatingWindow(self, didChangeSize: frame.size)
}
// let currentWidth = containerView.bounds.width
// let newHeight = currentWidth / videoOrientation.aspectRatio
//
// UIView.animate(withDuration: 0.3) {
// var frame = self.containerView.frame
// frame.size.height = newHeight
// self.containerView.frame = frame
// self.delegate?.floatingWindow(self, didChangeSize: frame.size)
// }
guard let window = UIApplication.shared.yhKeyWindow() else { return }
let currentWidth = containerView.bounds.width
let newHeight = currentWidth / videoOrientation.aspectRatio
// 计算安全区域
let safeAreaInsets = window.safeAreaInsets
let maxHeight = window.bounds.height - safeAreaInsets.top - safeAreaInsets.bottom
// 如果新高度超过最大高度,则反过来调整宽度
let finalWidth: CGFloat
let finalHeight: CGFloat
if newHeight > maxHeight {
finalHeight = maxHeight
finalWidth = maxHeight * videoOrientation.aspectRatio
} else {
finalWidth = currentWidth
finalHeight = newHeight
}
// 确保浮窗位置在屏幕范围内
var newFrame = containerView.frame
newFrame.size.width = finalWidth
newFrame.size.height = finalHeight
// 检查右边界
if newFrame.maxX > window.bounds.width - 16 {
newFrame.origin.x = window.bounds.width - newFrame.width - 16
}
// 检查左边界
if newFrame.minX < 16 {
newFrame.origin.x = 16
}
// 检查底部边界
if newFrame.maxY > window.bounds.height - 44 {
newFrame.origin.y = window.bounds.height - newFrame.height - 44
}
// 检查顶部边界
if newFrame.minY < safeAreaInsets.top + 16 {
newFrame.origin.y = safeAreaInsets.top + 16
}
UIView.animate(withDuration: 0.3) {
self.containerView.frame = newFrame
self.delegate?.floatingWindow(self, didChangeSize: newFrame.size)
}
}
// MARK: - Gesture Handlers
......@@ -439,3 +491,22 @@ extension YHFloatingWindow: UIGestureRecognizerDelegate {
return true
}
}
// MARK: - YHPlayerDelegate
extension YHFloatingWindow: YHPlayerDelegate {
func player(_ player: YHPlayer, didChangedToState state: AgoraMediaPlayerState, reason: AgoraMediaPlayerReason) {
//
}
func player(_ player: YHPlayer, didChangedToPosition position: Int) {
//
}
func player(_ player: YHPlayer, didReceiveVideoSize size: CGSize) {
DispatchQueue.main.async {
self.setVideoSize(size)
}
}
func player(_ player: YHPlayer, didChangedTo positionMs: Int, atTimestamp timestampMs: TimeInterval) {
//
}
}
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