|
@@ -9,13 +9,15 @@ import Foundation
|
|
|
import BFUIKit
|
|
|
import Photos
|
|
|
import BFRecordScreenKit
|
|
|
+import UIKit
|
|
|
|
|
|
|
|
|
class INVideoExportController: BFBaseViewController {
|
|
|
|
|
|
var videoAsset : AVURLAsset?
|
|
|
var avplayerTimeObserver: NSKeyValueObservation?
|
|
|
-
|
|
|
+ let backV = UIView()
|
|
|
+ // 播放进度
|
|
|
lazy var progreddL : UILabel = {
|
|
|
let l = UILabel(frame: CGRect(x: 0, y: cDevice_iPhoneStatusBarHei, width: cScreenWidth, height: 14))
|
|
|
l.textAlignment = .center
|
|
@@ -26,15 +28,16 @@ class INVideoExportController: BFBaseViewController {
|
|
|
return l
|
|
|
}()
|
|
|
|
|
|
-
|
|
|
+ // 合成进度指示条
|
|
|
lazy var progressView : UIView = {
|
|
|
- let v = UIView(frame: CGRect(x: 0, y: navHeadImageView!.bottomY, width: 0, height: 10))
|
|
|
+ let v = UIView()
|
|
|
v.backgroundColor = .red
|
|
|
return v
|
|
|
}()
|
|
|
|
|
|
+ // 合成进度百分比lable
|
|
|
lazy var progressL : UILabel = {
|
|
|
- let la = UILabel(frame: CGRect(x: 0, y: navHeadImageView!.bottomY, width: cScreenWidth, height: 10))
|
|
|
+ let la = UILabel()
|
|
|
la.textColor = .white
|
|
|
la.textAlignment = .center
|
|
|
la.text = "0%"
|
|
@@ -42,6 +45,41 @@ class INVideoExportController: BFBaseViewController {
|
|
|
return la
|
|
|
}()
|
|
|
|
|
|
+ lazy var saveAllBtn:UIButton = {
|
|
|
+ let saveAllBtn = UIButton()
|
|
|
+ saveAllBtn.setImage(UIImage(named: "export_saveall_n"), for: .normal)
|
|
|
+ saveAllBtn.setImage(UIImage(named: "export_saveall_h"), for: .selected)
|
|
|
+ saveAllBtn.addTarget(self, action: #selector(saveAllAction(btn:)), for: .touchUpInside)
|
|
|
+ saveAllBtn.isSelected = true
|
|
|
+ return saveAllBtn
|
|
|
+ }()
|
|
|
+
|
|
|
+ lazy var saveOnlyBtn:UIButton = {
|
|
|
+ let saveOnlyBtn = UIButton()
|
|
|
+ saveOnlyBtn.setImage(UIImage(named: "export_saveonly_n"), for: .normal)
|
|
|
+ saveOnlyBtn.setImage(UIImage(named: "export_saveonly_h"), for: .selected)
|
|
|
+ saveOnlyBtn.addTarget(self, action: #selector(saveOnlyAction(btn:)), for: .touchUpInside)
|
|
|
+ return saveOnlyBtn
|
|
|
+ }()
|
|
|
+
|
|
|
+ lazy var exportBtn : UIButton = {
|
|
|
+ let exportBtn = UIButton()
|
|
|
+ exportBtn.setTitle(" 保存到相册", for: .normal)
|
|
|
+ exportBtn.setTitleColor(.white, for: .normal)
|
|
|
+ exportBtn.setImage(UIImage(named: "export_btn"), for: .normal)
|
|
|
+ exportBtn.backgroundColor = ThemeStyleColor
|
|
|
+ exportBtn.addCorner(roundingCorners: .allCorners, corner: 8)
|
|
|
+ exportBtn.addTarget(self, action: #selector(exportNow), for: .touchUpInside)
|
|
|
+ return exportBtn
|
|
|
+ }()
|
|
|
+
|
|
|
+ lazy var bottomView:UIView = {
|
|
|
+ let vv = UIView()
|
|
|
+ vv.backgroundColor = .black
|
|
|
+
|
|
|
+ return vv
|
|
|
+ }()
|
|
|
+
|
|
|
lazy var avplayer : AVPlayer = {
|
|
|
let avplayer = AVPlayer()
|
|
|
avplayerTimeObserver = avplayer.addPeriodicTimeObserver(forInterval: CMTime(value: 1, timescale: 100), queue: DispatchQueue.global()) {[weak self, weak avplayer] time in
|
|
@@ -66,20 +104,30 @@ class INVideoExportController: BFBaseViewController {
|
|
|
|
|
|
export.progress = {[weak self] progress in
|
|
|
DispatchQueue.main.async { [weak self] in
|
|
|
- self?.progressView.frame = CGRect(x: 0, y: self?.navHeadImageView?.bottomY ?? 0, width: (cScreenWidth) * CGFloat(progress), height: 10)
|
|
|
- self?.progressL.text = String(format: "%d%%", Int(progress*100))
|
|
|
+ if let sself = self {
|
|
|
+// let width = export.data?.first?.width ?? 0
|
|
|
+ sself.progressL.text = String(format: "%d%%", Int(progress*100))
|
|
|
+ sself.progressView.snp.updateConstraints { make in
|
|
|
+ make.width.equalTo(cScreenWidth * CGFloat(progress))
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
export.exportCompletion = {[weak self] (error, url) in
|
|
|
- guard let strongSelf = self else {
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- if let fileUrl = url {
|
|
|
- DispatchQueue.main.async { [weak self] in
|
|
|
+ DispatchQueue.main.async { [weak self] in
|
|
|
+ guard let sself = self else {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ sself.bottomView.isHidden = false
|
|
|
+ sself.progreddL.isHidden = false
|
|
|
+ sself.progressView.isHidden = true
|
|
|
+ sself.progressL.isHidden = true
|
|
|
+
|
|
|
+ if let fileUrl = url {
|
|
|
let item = AVPlayerItem(url: fileUrl)
|
|
|
- self?.avplayer.replaceCurrentItem(with: item)
|
|
|
- self?.avplayer.play()
|
|
|
+ sself.avplayer.replaceCurrentItem(with: item)
|
|
|
+ sself.avplayer.play()
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -107,26 +155,118 @@ class INVideoExportController: BFBaseViewController {
|
|
|
navHeadImageView?.backgroundColor = .black
|
|
|
leftButton(image: nil, imageName: nil, tintColor: UIColor.white)
|
|
|
|
|
|
- let backV = UIView(frame: CGRect(x: 0, y: navHeadImageView!.bottomY, width: cScreenWidth, height: 10))
|
|
|
+// backV.frame = CGRect(x: 0, y: navHeadImageView?.bottomY ?? 0, width: cScreenWidth, height: cScreenWidth)
|
|
|
backV.backgroundColor = .gray
|
|
|
+ backV.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(play)))
|
|
|
+
|
|
|
+
|
|
|
+ addSubviews()
|
|
|
+
|
|
|
+ export.prepareData()
|
|
|
+// export.startExprot()
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ func addSubviews(){
|
|
|
+
|
|
|
view.addSubview(backV)
|
|
|
- view.addSubview(progressView)
|
|
|
- view.addSubview(progressL)
|
|
|
- view.addSubview(progreddL)
|
|
|
+ view.addSubview(bottomView)
|
|
|
+
|
|
|
+ let playerLayer = AVPlayerLayer(player: avplayer)
|
|
|
+ backV.layer.addSublayer(playerLayer)
|
|
|
+
|
|
|
+ backV.addSubview(progressView)
|
|
|
+ backV.addSubview(progressL)
|
|
|
+ backV.addSubview(progreddL)
|
|
|
+
|
|
|
+ bottomView.addSubview(saveAllBtn)
|
|
|
+ bottomView.addSubview(saveOnlyBtn)
|
|
|
+ bottomView.addSubview(exportBtn)
|
|
|
+
|
|
|
+ backV.snp.makeConstraints { make in
|
|
|
+ make.left.right.equalToSuperview()
|
|
|
+ make.top.equalTo(navHeadImageView!.snp.bottom)
|
|
|
+ make.bottom.equalTo(bottomView.snp.top)
|
|
|
+ }
|
|
|
+
|
|
|
+ progressView.snp.makeConstraints { make in
|
|
|
+ make.center.height.equalToSuperview()
|
|
|
+ make.width.equalTo(0)
|
|
|
+ }
|
|
|
+
|
|
|
+ progressL.snp.makeConstraints { make in
|
|
|
+ make.center.width.equalToSuperview()
|
|
|
+ make.height.equalTo(20)
|
|
|
+ }
|
|
|
+
|
|
|
progreddL.snp.makeConstraints { make in
|
|
|
- make.top.equalTo(progressView.snp.bottom).offset(10)
|
|
|
- make.centerX.equalTo(progressL)
|
|
|
+ make.bottom.equalToSuperview().offset(-10)
|
|
|
+ make.centerX.equalTo(backV)
|
|
|
make.width.equalTo(100)
|
|
|
make.height.equalTo(20)
|
|
|
}
|
|
|
-
|
|
|
- let playerLayer = AVPlayerLayer(player: avplayer)
|
|
|
- playerLayer.frame = CGRect(x: 10, y: self.progressView.bottomY, width: cScreenWidth - 20, height: cScreenHeigth - self.progressView.bottomY - 10)
|
|
|
- view.layer.addSublayer(playerLayer)
|
|
|
|
|
|
- export.startExprot()
|
|
|
|
|
|
- view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(play)))
|
|
|
+ bottomView.snp.makeConstraints { make in
|
|
|
+ make.left.right.equalToSuperview()
|
|
|
+ if #available(iOS 11.0, *) {
|
|
|
+ make.bottom.equalTo(view.safeAreaLayoutGuide.snp.bottom)
|
|
|
+ } else {
|
|
|
+ make.bottom.equalToSuperview()
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ exportBtn.snp.makeConstraints { make in
|
|
|
+ make.left.equalTo(saveAllBtn)
|
|
|
+ make.right.equalTo(saveOnlyBtn)
|
|
|
+ make.height.equalTo(50)
|
|
|
+ make.bottom.equalTo(-40)
|
|
|
+ }
|
|
|
+
|
|
|
+ saveAllBtn.snp.makeConstraints { make in
|
|
|
+ make.left.equalTo(16)
|
|
|
+ make.bottom.equalTo(exportBtn.snp.top).offset(-21)
|
|
|
+ make.height.equalTo(70)
|
|
|
+ make.top.equalTo(28)
|
|
|
+ }
|
|
|
+
|
|
|
+ saveOnlyBtn.snp.makeConstraints { make in
|
|
|
+ make.left.equalTo(saveAllBtn.snp.right).offset(16)
|
|
|
+ make.top.height.width.equalTo(saveAllBtn)
|
|
|
+ make.right.equalTo(-16)
|
|
|
+ }
|
|
|
+
|
|
|
+ DispatchQueue.main.asyncAfter(deadline: .now()+0) {[weak self] in
|
|
|
+ playerLayer.frame = self!.backV.bounds
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ //MARK: - 按钮事件
|
|
|
+
|
|
|
+ @objc func exportNow(){
|
|
|
+ bottomView.isHidden = true
|
|
|
+ progressView.isHidden = false
|
|
|
+ progressL.isHidden = false
|
|
|
+ progreddL.isHidden = true
|
|
|
+ export.startExprot(synthesisAll:saveAllBtn.isSelected)
|
|
|
+ }
|
|
|
+
|
|
|
+ @objc func saveAllAction(btn:UIButton){
|
|
|
+ if btn.isSelected {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ btn.isSelected = true
|
|
|
+ saveOnlyBtn.isSelected = false
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @objc func saveOnlyAction(btn:UIButton){
|
|
|
+ if btn.isSelected {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ btn.isSelected = true
|
|
|
+ saveAllBtn.isSelected = false
|
|
|
}
|
|
|
|
|
|
@objc func play(){
|