|
@@ -5,13 +5,13 @@
|
|
// Created by 胡志强 on 2021/11/29.
|
|
// Created by 胡志强 on 2021/11/29.
|
|
//
|
|
//
|
|
|
|
|
|
|
|
+import BFAnalyzeKit
|
|
import BFCommonKit
|
|
import BFCommonKit
|
|
import BFRecordScreenKit
|
|
import BFRecordScreenKit
|
|
import BFUIKit
|
|
import BFUIKit
|
|
import Foundation
|
|
import Foundation
|
|
import Photos
|
|
import Photos
|
|
import UIKit
|
|
import UIKit
|
|
-import BFAnalyzeKit
|
|
|
|
|
|
|
|
class INVideoExportController: BFBaseViewController {
|
|
class INVideoExportController: BFBaseViewController {
|
|
var avplayerTimeObserver: NSKeyValueObservation?
|
|
var avplayerTimeObserver: NSKeyValueObservation?
|
|
@@ -31,15 +31,7 @@ class INVideoExportController: BFBaseViewController {
|
|
}
|
|
}
|
|
|
|
|
|
// 预览播放进度
|
|
// 预览播放进度
|
|
- lazy var progreddL: UILabel = {
|
|
|
|
- let l = UILabel(frame: CGRect(x: 0, y: cDevice_iPhoneStatusBarHei, width: cScreenWidth, height: 14))
|
|
|
|
- l.textAlignment = .center
|
|
|
|
- l.font = UIFont.systemFont(ofSize: 10)
|
|
|
|
- l.textColor = .white
|
|
|
|
- l.shadowColor = .black
|
|
|
|
- l.shadowOffset = CGSize(width: 1, height: 1)
|
|
|
|
- return l
|
|
|
|
- }()
|
|
|
|
|
|
+ var sliderView: BFVideoPlayerSliderView?
|
|
|
|
|
|
// 合成进度指示条
|
|
// 合成进度指示条
|
|
lazy var progressView: UIView = {
|
|
lazy var progressView: UIView = {
|
|
@@ -105,17 +97,18 @@ class INVideoExportController: BFBaseViewController {
|
|
|
|
|
|
lazy var avplayer: AVPlayer = {
|
|
lazy var avplayer: AVPlayer = {
|
|
let avplayer = AVPlayer()
|
|
let avplayer = AVPlayer()
|
|
- avplayerTimeObserver = avplayer.addPeriodicTimeObserver(forInterval: CMTime(value: 1, timescale: 100), queue: DispatchQueue.global()) { [weak self, weak avplayer] time in
|
|
|
|
|
|
+ avplayerTimeObserver = avplayer.addPeriodicTimeObserver(forInterval: CMTime(value: 1, timescale: 100), queue: DispatchQueue.global()) { [weak self, weak avplayer] _ in
|
|
// 进度监控
|
|
// 进度监控
|
|
if let item = avplayer?.currentItem {
|
|
if let item = avplayer?.currentItem {
|
|
DispatchQueue.main.async { [weak self] in
|
|
DispatchQueue.main.async { [weak self] in
|
|
- self?.progreddL.text = String(format: "%@ / %@", CMTimeGetSeconds(time).formatDurationToHMS(), CMTimeGetSeconds(item.duration).formatDurationToHMS())
|
|
|
|
|
|
+ self?.sliderView?.progress = CMTimeGetSeconds(item.currentTime()) / CMTimeGetSeconds(item.duration)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} as? NSKeyValueObservation
|
|
} as? NSKeyValueObservation
|
|
|
|
|
|
- NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: avplayer.currentItem, queue: .main) { [weak avplayer] _ in
|
|
|
|
|
|
+ NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: avplayer.currentItem, queue: .main) { [weak avplayer,weak self] _ in
|
|
avplayer?.seek(to: CMTime.zero)
|
|
avplayer?.seek(to: CMTime.zero)
|
|
|
|
+ self?.sliderView?.playEnd()
|
|
}
|
|
}
|
|
|
|
|
|
return avplayer
|
|
return avplayer
|
|
@@ -150,7 +143,7 @@ class INVideoExportController: BFBaseViewController {
|
|
sself.saveToPhotoBtn.isEnabled = true
|
|
sself.saveToPhotoBtn.isEnabled = true
|
|
sself.completeBtn.isEnabled = true
|
|
sself.completeBtn.isEnabled = true
|
|
|
|
|
|
- sself.progreddL.isHidden = false
|
|
|
|
|
|
+ sself.sliderView?.isHidden = false
|
|
sself.progressView.isHidden = true
|
|
sself.progressView.isHidden = true
|
|
sself.progressL.isHidden = true
|
|
sself.progressL.isHidden = true
|
|
|
|
|
|
@@ -168,10 +161,12 @@ class INVideoExportController: BFBaseViewController {
|
|
sself.saveOnlyUlr = fileUrl
|
|
sself.saveOnlyUlr = fileUrl
|
|
sself.hasExportOnly = true
|
|
sself.hasExportOnly = true
|
|
}
|
|
}
|
|
|
|
+ // 添加播放进度视图
|
|
|
|
+ self?.addVideoSliderView()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// 合成成功上报
|
|
// 合成成功上报
|
|
- BFEventTrackAdaptor.baseReportUpload(businessType: nil, objectType: .ot_composeSuccess, pageSource: .sp_composePage,commonParams: commonParams())
|
|
|
|
|
|
+ BFEventTrackAdaptor.baseReportUpload(businessType: nil, objectType: .ot_composeSuccess, pageSource: .sp_composePage, commonParams: commonParams())
|
|
}
|
|
}
|
|
return export
|
|
return export
|
|
}()
|
|
}()
|
|
@@ -201,9 +196,7 @@ class INVideoExportController: BFBaseViewController {
|
|
}
|
|
}
|
|
return
|
|
return
|
|
}
|
|
}
|
|
- if !(hasExportAll || hasExportOnly) {
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
|
|
+ if !(hasExportAll || hasExportOnly) {}
|
|
export.cancelExport()
|
|
export.cancelExport()
|
|
super.backBtnClick()
|
|
super.backBtnClick()
|
|
}
|
|
}
|
|
@@ -216,7 +209,7 @@ class INVideoExportController: BFBaseViewController {
|
|
|
|
|
|
// backV.frame = CGRect(x: 0, y: navHeadImageView?.bottomY ?? 0, width: cScreenWidth, height: cScreenWidth)
|
|
// backV.frame = CGRect(x: 0, y: navHeadImageView?.bottomY ?? 0, width: cScreenWidth, height: cScreenWidth)
|
|
backV.backgroundColor = .clear
|
|
backV.backgroundColor = .clear
|
|
- backV.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(play)))
|
|
|
|
|
|
+// backV.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(play)))
|
|
|
|
|
|
addSubviews()
|
|
addSubviews()
|
|
|
|
|
|
@@ -236,7 +229,6 @@ class INVideoExportController: BFBaseViewController {
|
|
|
|
|
|
backV.addSubview(progressView)
|
|
backV.addSubview(progressView)
|
|
backV.addSubview(progressL)
|
|
backV.addSubview(progressL)
|
|
- backV.addSubview(progreddL)
|
|
|
|
|
|
|
|
bottomView.addSubview(saveAllBtn)
|
|
bottomView.addSubview(saveAllBtn)
|
|
bottomView.addSubview(saveOnlyBtn)
|
|
bottomView.addSubview(saveOnlyBtn)
|
|
@@ -259,13 +251,6 @@ class INVideoExportController: BFBaseViewController {
|
|
make.height.equalTo(28)
|
|
make.height.equalTo(28)
|
|
}
|
|
}
|
|
|
|
|
|
- progreddL.snp.makeConstraints { make in
|
|
|
|
- make.bottom.equalToSuperview().offset(-10)
|
|
|
|
- make.centerX.equalTo(backV)
|
|
|
|
- make.width.equalTo(100)
|
|
|
|
- make.height.equalTo(20)
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
bottomView.snp.makeConstraints { make in
|
|
bottomView.snp.makeConstraints { make in
|
|
make.left.right.equalToSuperview()
|
|
make.left.right.equalToSuperview()
|
|
if #available(iOS 11.0, *) {
|
|
if #available(iOS 11.0, *) {
|
|
@@ -306,6 +291,28 @@ class INVideoExportController: BFBaseViewController {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /// 添加播放进度视图
|
|
|
|
+ func addVideoSliderView() {
|
|
|
|
+ if sliderView == nil {
|
|
|
|
+ sliderView = BFVideoPlayerSliderView(frame: CGRect(x: 0, y: backV.frame.height - 60, width: backV.frame.width, height: 50))
|
|
|
|
+ sliderView?.valueChangeBloc = { [weak self] sender in
|
|
|
|
+ let cmtime = CMTime(value: CMTimeValue(Float64(sender.value) * Float64(self?.avplayer.currentItem?.asset.duration.seconds ?? 0) * 1000.0), timescale: CMTimeScale(1000.0))
|
|
|
|
+ BFLog(message: "cmtime == \(cmtime),\(cmtime.seconds)")
|
|
|
|
+ self?.avplayer.seek(to: cmtime)
|
|
|
|
+ }
|
|
|
|
+ sliderView?.btnClickBloc = { [weak self] sender in
|
|
|
|
+ // 按钮点击
|
|
|
|
+ if sender.tag == 1 {
|
|
|
|
+ self?.play(sender: sender)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ sliderView?.duration = avplayer.currentItem?.asset.duration.seconds ?? 0
|
|
|
|
+ if sliderView?.superview == nil {
|
|
|
|
+ backV.addSubview(sliderView!)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
// MARK: - 按钮事件
|
|
// MARK: - 按钮事件
|
|
|
|
|
|
func exportNow() {
|
|
func exportNow() {
|
|
@@ -322,11 +329,11 @@ class INVideoExportController: BFBaseViewController {
|
|
|
|
|
|
progressView.isHidden = false
|
|
progressView.isHidden = false
|
|
progressL.isHidden = false
|
|
progressL.isHidden = false
|
|
- progreddL.isHidden = true
|
|
|
|
|
|
+ sliderView?.isHidden = true
|
|
export.startExprot(synthesisAll: saveAllBtn.isSelected)
|
|
export.startExprot(synthesisAll: saveAllBtn.isSelected)
|
|
UIApplication.shared.isIdleTimerDisabled = true
|
|
UIApplication.shared.isIdleTimerDisabled = true
|
|
// 开始合成上报
|
|
// 开始合成上报
|
|
- BFEventTrackAdaptor.baseReportUpload(businessType: nil, objectType: .ot_startCompose, pageSource: .sp_composePage,commonParams: commonParams())
|
|
|
|
|
|
+ BFEventTrackAdaptor.baseReportUpload(businessType: nil, objectType: .ot_startCompose, pageSource: .sp_composePage, commonParams: commonParams())
|
|
}
|
|
}
|
|
|
|
|
|
@objc func saveToPhotoNow() {
|
|
@objc func saveToPhotoNow() {
|
|
@@ -337,7 +344,7 @@ class INVideoExportController: BFBaseViewController {
|
|
if let url = (avplayer.currentItem?.asset as? AVURLAsset)?.url {
|
|
if let url = (avplayer.currentItem?.asset as? AVURLAsset)?.url {
|
|
PHPhotoLibrary.shared().performChanges {
|
|
PHPhotoLibrary.shared().performChanges {
|
|
PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: url)
|
|
PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: url)
|
|
- } completionHandler: {[weak self] isFinished, _ in
|
|
|
|
|
|
+ } completionHandler: { [weak self] isFinished, _ in
|
|
guard let sself = self else {
|
|
guard let sself = self else {
|
|
return
|
|
return
|
|
}
|
|
}
|
|
@@ -354,7 +361,7 @@ class INVideoExportController: BFBaseViewController {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// 点击保存至相册上报
|
|
// 点击保存至相册上报
|
|
- BFEventTrackAdaptor.baseReportUpload(businessType: .bt_buttonClick, objectType: .ot_saveToAblum, pageSource: .sp_composePage,extParams: (saveAllBtn.isSelected ? ["saveAll":true] : ["saveRecord":true]),commonParams: commonParams())
|
|
|
|
|
|
+ BFEventTrackAdaptor.baseReportUpload(businessType: .bt_buttonClick, objectType: .ot_saveToAblum, pageSource: .sp_composePage, extParams: saveAllBtn.isSelected ? ["saveAll": true] : ["saveRecord": true], commonParams: commonParams())
|
|
}
|
|
}
|
|
|
|
|
|
@objc func saveAllAction(btn: UIButton) {
|
|
@objc func saveAllAction(btn: UIButton) {
|
|
@@ -391,8 +398,10 @@ class INVideoExportController: BFBaseViewController {
|
|
|
|
|
|
@objc func completeAction() {
|
|
@objc func completeAction() {
|
|
// MARK: 删除所有录制资源. 现在放在了选择相册展示时清理cache
|
|
// MARK: 删除所有录制资源. 现在放在了选择相册展示时清理cache
|
|
- if (!self.hasSaveOnly && self.saveOnlyUlr.absoluteString != "aaa")
|
|
|
|
- || (!self.hasSaveAll && self.saveAllUlr.absoluteString != "aaa") {
|
|
|
|
|
|
+
|
|
|
|
+ if (!hasSaveOnly && saveOnlyUlr.absoluteString != "aaa")
|
|
|
|
+ || (!hasSaveAll && saveAllUlr.absoluteString != "aaa")
|
|
|
|
+ {
|
|
let remindData = BFBaseModel()
|
|
let remindData = BFBaseModel()
|
|
remindData.summary = "合成的视频尚未保存到相册"
|
|
remindData.summary = "合成的视频尚未保存到相册"
|
|
let alertV = BFRemindView(frame: view.bounds)
|
|
let alertV = BFRemindView(frame: view.bounds)
|
|
@@ -405,47 +414,45 @@ class INVideoExportController: BFBaseViewController {
|
|
return
|
|
return
|
|
}
|
|
}
|
|
if item.tag == 1 { // 确定返回到上一层
|
|
if item.tag == 1 { // 确定返回到上一层
|
|
- if sself.hasExportOnly{
|
|
|
|
|
|
+ if sself.hasExportOnly {
|
|
PHPhotoLibrary.shared().performChanges {
|
|
PHPhotoLibrary.shared().performChanges {
|
|
PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: sself.saveOnlyUlr)
|
|
PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: sself.saveOnlyUlr)
|
|
- } completionHandler: { isFinished, _ in
|
|
|
|
-
|
|
|
|
|
|
+ } completionHandler: { _, _ in
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- if sself.hasExportAll{
|
|
|
|
|
|
+ if sself.hasExportAll {
|
|
PHPhotoLibrary.shared().performChanges {
|
|
PHPhotoLibrary.shared().performChanges {
|
|
PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: sself.saveAllUlr)
|
|
PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: sself.saveAllUlr)
|
|
- } completionHandler: { isFinished, _ in
|
|
|
|
-
|
|
|
|
|
|
+ } completionHandler: { _, _ in
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
sself.export.cancelExport()
|
|
sself.export.cancelExport()
|
|
sself.navigationController?.popToRootViewController(animated: true)
|
|
sself.navigationController?.popToRootViewController(animated: true)
|
|
}
|
|
}
|
|
UIApplication.shared.keyWindow?.addSubview(alertV)
|
|
UIApplication.shared.keyWindow?.addSubview(alertV)
|
|
- }else{
|
|
|
|
|
|
+ } else {
|
|
export.cancelExport()
|
|
export.cancelExport()
|
|
navigationController?.popToRootViewController(animated: true)
|
|
navigationController?.popToRootViewController(animated: true)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- @objc func play() {
|
|
|
|
|
|
+ @objc func play(sender: UIButton) {
|
|
if isExporting {
|
|
if isExporting {
|
|
avplayer.pause()
|
|
avplayer.pause()
|
|
return
|
|
return
|
|
}
|
|
}
|
|
if avplayer.currentItem != nil {
|
|
if avplayer.currentItem != nil {
|
|
- if avplayer.timeControlStatus == .playing {
|
|
|
|
|
|
+ if avplayer.timeControlStatus == .playing || sender.isSelected {
|
|
avplayer.pause()
|
|
avplayer.pause()
|
|
} else if avplayer.timeControlStatus == .paused {
|
|
} else if avplayer.timeControlStatus == .paused {
|
|
avplayer.play()
|
|
avplayer.play()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-
|
|
|
|
- func whetherCancelExport(comfirm:(()->Void)?){
|
|
|
|
|
|
+
|
|
|
|
+ func whetherCancelExport(comfirm: (() -> Void)?) {
|
|
let remindData = BFBaseModel()
|
|
let remindData = BFBaseModel()
|
|
remindData.summary = "正在合成中,是否取消?"
|
|
remindData.summary = "正在合成中,是否取消?"
|
|
let alertV = BFRemindView(frame: view.bounds)
|
|
let alertV = BFRemindView(frame: view.bounds)
|
|
@@ -461,7 +468,6 @@ class INVideoExportController: BFBaseViewController {
|
|
sself.export.cancelExport()
|
|
sself.export.cancelExport()
|
|
comfirm?()
|
|
comfirm?()
|
|
}
|
|
}
|
|
-
|
|
|
|
}
|
|
}
|
|
UIApplication.shared.keyWindow?.addSubview(alertV)
|
|
UIApplication.shared.keyWindow?.addSubview(alertV)
|
|
}
|
|
}
|