Commit 9fbce6b9 authored by Steven杜宇's avatar Steven杜宇

// 视频播放

parent c6cbd098
...@@ -22,7 +22,7 @@ target 'galaxy' do ...@@ -22,7 +22,7 @@ target 'galaxy' do
#数据加、解密 #数据加、解密
pod 'CryptoSwift','1.8.0' pod 'CryptoSwift','1.8.0'
#手动布局 #手动布局
pod 'SnapKit','5.6.0' pod 'SnapKit','5.0.0'
#底部tabbar布局 #底部tabbar布局
pod 'ESTabBarController-swift' , '2.8.0' pod 'ESTabBarController-swift' , '2.8.0'
#扩展集合 #扩展集合
...@@ -77,6 +77,9 @@ target 'galaxy' do ...@@ -77,6 +77,9 @@ target 'galaxy' do
pod 'HandyJSON', '5.0.2' pod 'HandyJSON', '5.0.2'
#微信SDK #微信SDK
pod 'WechatOpenSDK', '2.0.2' pod 'WechatOpenSDK', '2.0.2'
#视频播放器
pod 'BMPlayer', '~> 1.3.0'
end end
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
objects = { objects = {
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
0408C3632BEC7C6900DB1E25 /* YHVideoPlayerControlView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0408C3622BEC7C6900DB1E25 /* YHVideoPlayerControlView.swift */; };
0414BDA92BC7E81500225367 /* YHMyPermissionSettingVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0414BDA82BC7E81500225367 /* YHMyPermissionSettingVC.swift */; }; 0414BDA92BC7E81500225367 /* YHMyPermissionSettingVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0414BDA82BC7E81500225367 /* YHMyPermissionSettingVC.swift */; };
0414BDAB2BC7E9C200225367 /* YHMyPermissionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0414BDAA2BC7E9C200225367 /* YHMyPermissionCell.swift */; }; 0414BDAB2BC7E9C200225367 /* YHMyPermissionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0414BDAA2BC7E9C200225367 /* YHMyPermissionCell.swift */; };
0414BDAD2BC7F02C00225367 /* YHMyNotifySettingVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0414BDAC2BC7F02C00225367 /* YHMyNotifySettingVC.swift */; }; 0414BDAD2BC7F02C00225367 /* YHMyNotifySettingVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0414BDAC2BC7F02C00225367 /* YHMyNotifySettingVC.swift */; };
...@@ -464,6 +465,7 @@ ...@@ -464,6 +465,7 @@
/* End PBXCopyFilesBuildPhase section */ /* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
0408C3622BEC7C6900DB1E25 /* YHVideoPlayerControlView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHVideoPlayerControlView.swift; sourceTree = "<group>"; };
0414BDA82BC7E81500225367 /* YHMyPermissionSettingVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMyPermissionSettingVC.swift; sourceTree = "<group>"; }; 0414BDA82BC7E81500225367 /* YHMyPermissionSettingVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMyPermissionSettingVC.swift; sourceTree = "<group>"; };
0414BDAA2BC7E9C200225367 /* YHMyPermissionCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMyPermissionCell.swift; sourceTree = "<group>"; }; 0414BDAA2BC7E9C200225367 /* YHMyPermissionCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMyPermissionCell.swift; sourceTree = "<group>"; };
0414BDAC2BC7F02C00225367 /* YHMyNotifySettingVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMyNotifySettingVC.swift; sourceTree = "<group>"; }; 0414BDAC2BC7F02C00225367 /* YHMyNotifySettingVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMyNotifySettingVC.swift; sourceTree = "<group>"; };
...@@ -1752,6 +1754,7 @@ ...@@ -1752,6 +1754,7 @@
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
04AF514D2BEB585C00009E3A /* YHVideoPlayerVC.swift */, 04AF514D2BEB585C00009E3A /* YHVideoPlayerVC.swift */,
0408C3622BEC7C6900DB1E25 /* YHVideoPlayerControlView.swift */,
); );
path = VideoPlay; path = VideoPlay;
sourceTree = "<group>"; sourceTree = "<group>";
...@@ -2689,6 +2692,7 @@ ...@@ -2689,6 +2692,7 @@
04174D762BCD5B74000BA46D /* YHMsgListModel.swift in Sources */, 04174D762BCD5B74000BA46D /* YHMsgListModel.swift in Sources */,
045EEEE32B9F171A0022A143 /* YHMySignatureListModel.swift in Sources */, 045EEEE32B9F171A0022A143 /* YHMySignatureListModel.swift in Sources */,
049AC4C62BC3E55300F857F4 /* YHServiceSectionView.swift in Sources */, 049AC4C62BC3E55300F857F4 /* YHServiceSectionView.swift in Sources */,
0408C3632BEC7C6900DB1E25 /* YHVideoPlayerControlView.swift in Sources */,
A567E5B12BD7643D00D5D5A0 /* YHHomeCollectionViewCell.swift in Sources */, A567E5B12BD7643D00D5D5A0 /* YHHomeCollectionViewCell.swift in Sources */,
A582B2432BB95E20009D098C /* YHHKPlanCell.swift in Sources */, A582B2432BB95E20009D098C /* YHHKPlanCell.swift in Sources */,
045EEEC52B9F171A0022A143 /* YHOtherPickerView.swift in Sources */, 045EEEC52B9F171A0022A143 /* YHOtherPickerView.swift in Sources */,
......
...@@ -137,11 +137,6 @@ class YHSearchInfomationVC: YHBaseViewController { ...@@ -137,11 +137,6 @@ class YHSearchInfomationVC: YHBaseViewController {
return view return view
}() }()
lazy var playerViewController: AVPlayerViewController = {
let vc = AVPlayerViewController()
return vc
}()
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
self.setupUI() self.setupUI()
...@@ -344,14 +339,11 @@ extension YHSearchInfomationVC: UITableViewDelegate, UITableViewDataSource { ...@@ -344,14 +339,11 @@ extension YHSearchInfomationVC: UITableViewDelegate, UITableViewDataSource {
let model = items[indexPath.section] let model = items[indexPath.section]
if model.type == 1 { // 视频 if model.type == 1 { // 视频
if !model.media_url.isEmpty, let url = URL(string: model.media_url) { if !model.media_url.isEmpty, let url = URL(string: model.media_url) {
let player = AVPlayer(url:url)
player.isMuted = true
playerViewController.player = player
self.present(self.playerViewController, animated: true) {
self.playerViewController.player!.play() // 开始播放视频
}
let vc = YHVideoPlayerVC()
vc.url = model.media_url
vc.id = model.id
self.navigationController?.pushViewController(vc)
DispatchQueue.main.async { DispatchQueue.main.async {
self.homeViewModel.getWebDetail(model.id) { success, error in self.homeViewModel.getWebDetail(model.id) { success, error in
} }
......
...@@ -82,11 +82,6 @@ class YHHomeCollectionViewCell: UICollectionViewCell { ...@@ -82,11 +82,6 @@ class YHHomeCollectionViewCell: UICollectionViewCell {
btn.isHidden = true btn.isHidden = true
return btn return btn
}() }()
lazy var playerViewController: AVPlayerViewController = {
let vc = AVPlayerViewController()
return vc
}()
} }
extension YHHomeCollectionViewCell { extension YHHomeCollectionViewCell {
...@@ -95,13 +90,11 @@ extension YHHomeCollectionViewCell { ...@@ -95,13 +90,11 @@ extension YHHomeCollectionViewCell {
guard let listModel = listModel else { return } guard let listModel = listModel else { return }
if listModel.media_url.isEmpty == false,let url = URL(string: listModel.media_url) { if listModel.media_url.isEmpty == false,let url = URL(string: listModel.media_url) {
let player = AVPlayer(url:url)
player.isMuted = true
playerViewController.player = player
self.parentViewController?.present(playerViewController, animated: true) { let vc = YHVideoPlayerVC()
self.playerViewController.player!.play() // 开始播放视频 vc.url = listModel.media_url
} vc.id = listModel.id
self.parentViewController?.navigationController?.pushViewController(vc)
DispatchQueue.main.async { DispatchQueue.main.async {
self.viewModel.getWebDetail(listModel.id) { success, error in self.viewModel.getWebDetail(listModel.id) { success, error in
......
//
// YHVideoPlayerControlView.swift
// galaxy
//
// Created by edy on 2024/5/9.
// Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
import BMPlayer
import AVFoundation
class YHVideoPlayerControlView: BMPlayerControlView {
lazy var volumeBtn = {
let btn = UIButton()
btn.setImage(UIImage(named: "mine_btn_setting"), for: .normal)
return btn
}()
func createUI() {
self.isFullscreen = false
self.fullscreenButton.isHidden = true
self.fullscreenButton.snp.updateConstraints { make in
make.width.height.equalTo(0)
}
self.mainMaskView.addSubview(volumeBtn)
volumeBtn.snp.makeConstraints { make in
make.width.height.equalTo(24)
make.top.equalTo(20)
make.left.equalTo(15)
}
}
// MARK: - Init
override public init(frame: CGRect) {
super.init(frame: frame)
createUI()
}
required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
createUI()
}
override public func controlViewAnimation(isShow: Bool) {
super.controlViewAnimation(isShow: isShow)
let alpha: CGFloat = isShow ? 1.0 : 0.0
UIView.animate(withDuration: 0.3, animations: {[weak self] in
guard let self = self else { return }
self.volumeBtn.alpha = alpha
})
}
}
...@@ -8,12 +8,43 @@ ...@@ -8,12 +8,43 @@
import UIKit import UIKit
import AVFoundation import AVFoundation
import AVKit
import BMPlayer
class YHVideoPlayerVC: YHBaseViewController { class YHVideoPlayerVC: YHBaseViewController {
var url:String = "" var url:String = ""
private var player: AVPlayer? var id: Int = 0
private var playerLayer: AVPlayerLayer? typealias Block = (YHWebModel) -> ()
var block: Block?
private var operationFlag:Bool = false
lazy var viewModel: YHHomeWebViewModel = {
return YHHomeWebViewModel()
}()
lazy var player:BMPlayer = {
// should print log, default false
BMPlayerConf.allowLog = false
// should auto play, default true
BMPlayerConf.shouldAutoPlay = true
// main tint color, default whiteColor
BMPlayerConf.tintColor = UIColor.white
// options to show header view (which include the back button, title and definition change button) , default .Always,options: .Always, .HorizantalOnly and .None
BMPlayerConf.topBarShowInCase = .none
// loader type, see detail:https://github.com/ninjaprox/NVActivityIndicatorView
BMPlayerConf.loaderType = .ballRotateChase
// enable setting the brightness by touch gesture in the player
BMPlayerConf.enableBrightnessGestures = false
// enable setting the volume by touch gesture in the player
BMPlayerConf.enableVolumeGestures = false
// enable setting the playtime by touch gesture in the player
BMPlayerConf.enablePlaytimeGestures = false
let player = BMPlayer(customControlView: YHVideoPlayerControlView())
return player
}()
lazy var navBar: UIView = { lazy var navBar: UIView = {
let bar = UIView() let bar = UIView()
...@@ -43,43 +74,118 @@ class YHVideoPlayerVC: YHBaseViewController { ...@@ -43,43 +74,118 @@ class YHVideoPlayerVC: YHBaseViewController {
return bar return bar
}() }()
var bottomView: YHHomeWebBottomView!
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
createUI() createUI()
play() requestData()
} }
func createUI() { func createUI() {
gk_navigationBar.isHidden = true gk_navigationBar.isHidden = true
view.backgroundColor = .black view.backgroundColor = .black
view.addSubview(navBar) view.addSubview(navBar)
bottomView = {
let view = YHHomeWebBottomView()
view.tintMode = .dark
view.isLike = false
view.isStar = false
view.likeBlock = { [weak self] flag in
guard let self = self else { return }
if YHLoginManager.shared.isLogin() == false {
let vc = UINavigationController(rootVC: YHPhoneLoginViewController())
vc.modalPresentationStyle = .custom
self.navigationController?.present(vc, animated: true)
return
}
if flag {
self.viewModel.getLike(self.id, 1) {[weak self] success, error in
guard let self = self else { return }
if success {
operationFlag = true
self.getData()
} else {
operationFlag = false
}
}
} else {
self.viewModel.getLike(self.id, 0) {[weak self] success, error in
guard let self = self else { return }
if success {
operationFlag = true
self.getData()
} else {
operationFlag = false
}
}
}
}
view.starBlock = { [weak self] flag in
guard let self = self else { return }
if YHLoginManager.shared.isLogin() == false {
let vc = UINavigationController(rootVC: YHPhoneLoginViewController())
vc.modalPresentationStyle = .custom
self.navigationController?.present(vc, animated: true)
return
}
if flag {
self.viewModel.getStar(self.id, 1) {[weak self] success, error in
guard let self = self else { return }
if success {
operationFlag = true
YHHUD.flash(message: "已加入收藏")
self.getData()
} else {
operationFlag = false
}
}
} else {
self.viewModel.getStar(self.id, 0) {[weak self] success, error in
guard let self = self else { return }
if success {
operationFlag = true
self.getData()
} else {
operationFlag = false
}
}
}
}
return view
}()
view.addSubview(bottomView)
setupPlayerUI() setupPlayerUI()
navBar.snp.makeConstraints { make in navBar.snp.makeConstraints { make in
make.left.right.equalToSuperview() make.left.right.equalToSuperview()
make.top.equalToSuperview().offset(k_Height_statusBar()) make.top.equalToSuperview().offset(k_Height_statusBar())
make.height.equalTo(k_Height_NavContentBar) make.height.equalTo(k_Height_NavContentBar)
} }
bottomView.snp.makeConstraints { make in
make.bottom.left.right.equalToSuperview()
make.height.equalTo(YHHomeWebBottomView.height + k_Height_safeAreaInsetsBottom())
}
} }
func setupPlayerUI() { func setupPlayerUI() {
view.addSubview(player)
player.snp.makeConstraints { make in
make.top.equalTo(k_Height_NavigationtBarAndStatuBar+20)
make.left.right.equalTo(0)
make.bottom.equalTo(-k_Height_safeAreaInsetsBottom()-YHHomeWebBottomView.height-20)
}
guard let videoURL = URL(string: url) else { guard let videoURL = URL(string: url) else {
YHHUD.flash(message: "无效URL") YHHUD.flash(message: "无效URL")
return return
} }
player = AVPlayer(url: videoURL) let asset = BMPlayerResource(url: videoURL)
playerLayer = AVPlayerLayer(player: player) player.setVideo(resource: asset)
playerLayer?.frame = CGRect(x: 0, y: k_Height_NavigationtBarAndStatuBar, width: KScreenWidth, height: KScreenHeight-k_Height_NavigationtBarAndStatuBar-k_Height_safeAreaInsetsBottom()) // 默认静音
view.layer.addSublayer(playerLayer!) player.avPlayer?.isMuted = true
}
func play() {
player?.play()
}
func pause() {
player?.pause()
} }
} }
...@@ -92,3 +198,41 @@ extension YHVideoPlayerVC { ...@@ -92,3 +198,41 @@ extension YHVideoPlayerVC {
} }
} }
extension YHVideoPlayerVC {
func getData() {
if id > 0 {
viewModel.getWebDetail(self.id) {[weak self] success, error in
guard let self = self else { return }
if success {
guard let model = self.viewModel.mainModel else { return }
bottomView.likeCount = model.like_count
bottomView.starCount = model.collect_count
bottomView.isStar = model.is_collect
bottomView.isLike = model.is_like
if operationFlag {
self.block?(model)
}
}
}
}
}
func requestData() {
if id == 0 {
if self.url.contains("?id=") {
let list = self.url.components(separatedBy: "?id=")
if list.count == 2 {
if let iddd = list[1].int {
id = iddd
getData()
return
}
}
}
}
getData()
}
}
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