|
@@ -67,34 +67,33 @@ public class BFRecordScreenController: BFBaseViewController {
|
|
var assetPlayer: AVPlayer? // 原视频音频播放器
|
|
var assetPlayer: AVPlayer? // 原视频音频播放器
|
|
var isCompletePlay = true
|
|
var isCompletePlay = true
|
|
var hadPrepareToPlayRecord = false // 录音播放器准备
|
|
var hadPrepareToPlayRecord = false // 录音播放器准备
|
|
- var recordPlayer: AVPlayer? // 录音音频播放器
|
|
|
|
- var movie: GPUImageMovie? // 视频预览
|
|
|
|
- var playView: GPUImageView? // 视频展示视图
|
|
|
|
|
|
+ var recordPlayer : AVPlayer? // 录音音频播放器
|
|
|
|
+ var movie : GPUImageMovie? // 视频预览
|
|
|
|
+ var playView : GPUImageView? // 视频展示视图
|
|
|
|
|
|
// MARK: 行为参数
|
|
// MARK: 行为参数
|
|
|
|
|
|
var events = [WithDrawModel]() // 行为记录,方便撤销
|
|
var events = [WithDrawModel]() // 行为记录,方便撤销
|
|
- var isDragingProgressSlder: Bool = false // 是否在拖动进度条
|
|
|
|
|
|
+ var isDragingProgressSlder : Bool = false // 是否在拖动进度条
|
|
var isStopAtRecordRange = -1
|
|
var isStopAtRecordRange = -1
|
|
|
|
|
|
// 保存识别出来的字幕信息,用于回放,和合成使用
|
|
// 保存识别出来的字幕信息,用于回放,和合成使用
|
|
// var saveSubTitles:[PQEditSubTitleModel] = Array.init()
|
|
// var saveSubTitles:[PQEditSubTitleModel] = Array.init()
|
|
// 定义音频的编码参数
|
|
// 定义音频的编码参数
|
|
- let recordSettings: [String: Any] = [AVSampleRateKey: 44100.0, // 声音采样率
|
|
|
|
|
|
+ let recordSettings : [String: Any] = [AVSampleRateKey: 44100.0, // 声音采样率
|
|
AVFormatIDKey: kAudioFormatLinearPCM, // 编码格式
|
|
AVFormatIDKey: kAudioFormatLinearPCM, // 编码格式
|
|
AVNumberOfChannelsKey: 1, // 采集音轨
|
|
AVNumberOfChannelsKey: 1, // 采集音轨
|
|
AVEncoderBitDepthHintKey: 16, // 位深
|
|
AVEncoderBitDepthHintKey: 16, // 位深
|
|
AVEncoderAudioQualityKey: AVAudioQuality.medium.rawValue] // 音频质量
|
|
AVEncoderAudioQualityKey: AVAudioQuality.medium.rawValue] // 音频质量
|
|
|
|
|
|
- // 录音相关
|
|
|
|
- lazy var recorderManager: BFVoiceRecordManager = {
|
|
|
|
|
|
+ //MARK: - 录音相关
|
|
|
|
+ lazy var recorderManager : BFVoiceRecordManager = {
|
|
let manager = BFVoiceRecordManager()
|
|
let manager = BFVoiceRecordManager()
|
|
manager.cancelRecordHandle = { _ in
|
|
manager.cancelRecordHandle = { _ in
|
|
}
|
|
}
|
|
manager.endRecordHandle = { [weak self] model, _ in
|
|
manager.endRecordHandle = { [weak self] model, _ in
|
|
if let sself = self, let model = model, FileManager.default.fileExists(atPath: model.wavFilePath ?? "") {
|
|
if let sself = self, let model = model, FileManager.default.fileExists(atPath: model.wavFilePath ?? "") {
|
|
// 加入到语音数组里
|
|
// 加入到语音数组里
|
|
- // TODO: 原逻辑要删除新录音后边的数据, 新逻辑是覆盖则删除
|
|
|
|
model.endTime = sself.currentAssetProgress.seconds
|
|
model.endTime = sself.currentAssetProgress.seconds
|
|
|
|
|
|
let newRange = CMTimeRange(start: CMTime(seconds: model.startTime, preferredTimescale: 1000), end: CMTime(seconds: model.endTime, preferredTimescale: 1000))
|
|
let newRange = CMTimeRange(start: CMTime(seconds: model.startTime, preferredTimescale: 1000), end: CMTime(seconds: model.endTime, preferredTimescale: 1000))
|
|
@@ -151,7 +150,7 @@ public class BFRecordScreenController: BFBaseViewController {
|
|
|
|
|
|
var indirectionView: BFIndirectionProgressView?
|
|
var indirectionView: BFIndirectionProgressView?
|
|
|
|
|
|
- lazy var progreddL: UILabel = {
|
|
|
|
|
|
+ lazy var progreddL : UILabel = {
|
|
let l = UILabel()
|
|
let l = UILabel()
|
|
l.textAlignment = .center
|
|
l.textAlignment = .center
|
|
l.font = UIFont.systemFont(ofSize: 10)
|
|
l.font = UIFont.systemFont(ofSize: 10)
|
|
@@ -162,7 +161,7 @@ public class BFRecordScreenController: BFBaseViewController {
|
|
return l
|
|
return l
|
|
}()
|
|
}()
|
|
|
|
|
|
- lazy var playBtn: UIButton = {
|
|
|
|
|
|
+ lazy var playBtn : UIButton = {
|
|
let btn = UIButton(frame: view.bounds)
|
|
let btn = UIButton(frame: view.bounds)
|
|
btn.setImage(imageInRecordScreenKit(by: "preview_play"), for: .normal)
|
|
btn.setImage(imageInRecordScreenKit(by: "preview_play"), for: .normal)
|
|
let vv = UIView(frame: CGRect(x: 0, y: 0, width: 1, height: 1))
|
|
let vv = UIView(frame: CGRect(x: 0, y: 0, width: 1, height: 1))
|
|
@@ -171,7 +170,7 @@ public class BFRecordScreenController: BFBaseViewController {
|
|
return btn
|
|
return btn
|
|
}()
|
|
}()
|
|
|
|
|
|
- lazy var bottomeView: UIImageView = {
|
|
|
|
|
|
+ lazy var bottomeView : UIImageView = {
|
|
let iv = UIImageView(image: imageInRecordScreenKit(by: "bottom_shadow"))
|
|
let iv = UIImageView(image: imageInRecordScreenKit(by: "bottom_shadow"))
|
|
iv.contentMode = .scaleAspectFill
|
|
iv.contentMode = .scaleAspectFill
|
|
iv.isUserInteractionEnabled = true
|
|
iv.isUserInteractionEnabled = true
|
|
@@ -185,7 +184,7 @@ public class BFRecordScreenController: BFBaseViewController {
|
|
return iv
|
|
return iv
|
|
}()
|
|
}()
|
|
|
|
|
|
- lazy var recordBtn: UIButton = {
|
|
|
|
|
|
+ lazy var recordBtn : UIButton = {
|
|
let btn = UIButton(type: .custom)
|
|
let btn = UIButton(type: .custom)
|
|
btn.backgroundColor = ThemeStyleColor
|
|
btn.backgroundColor = ThemeStyleColor
|
|
btn.setTitle("按住 说话", for: .normal)
|
|
btn.setTitle("按住 说话", for: .normal)
|
|
@@ -196,7 +195,7 @@ public class BFRecordScreenController: BFBaseViewController {
|
|
return btn
|
|
return btn
|
|
}()
|
|
}()
|
|
|
|
|
|
- lazy var deleteRecordBtn: UIButton = {
|
|
|
|
|
|
+ lazy var deleteRecordBtn : UIButton = {
|
|
let btn = UIButton(type: .custom)
|
|
let btn = UIButton(type: .custom)
|
|
btn.backgroundColor = .red
|
|
btn.backgroundColor = .red
|
|
btn.alpha = 0.5
|
|
btn.alpha = 0.5
|
|
@@ -207,7 +206,7 @@ public class BFRecordScreenController: BFBaseViewController {
|
|
return btn
|
|
return btn
|
|
}()
|
|
}()
|
|
|
|
|
|
- lazy var withDrawBtn: UIButton = {
|
|
|
|
|
|
+ lazy var withDrawBtn : UIButton = {
|
|
let btn = UIButton(type: .custom)
|
|
let btn = UIButton(type: .custom)
|
|
btn.setImage(imageInRecordScreenKit(by: "withdraw_n"), for: .normal)
|
|
btn.setImage(imageInRecordScreenKit(by: "withdraw_n"), for: .normal)
|
|
btn.setImage(imageInRecordScreenKit(by: "withdraw_h"), for: .highlighted)
|
|
btn.setImage(imageInRecordScreenKit(by: "withdraw_h"), for: .highlighted)
|
|
@@ -220,7 +219,7 @@ public class BFRecordScreenController: BFBaseViewController {
|
|
return btn
|
|
return btn
|
|
}()
|
|
}()
|
|
|
|
|
|
- lazy var changeVoiceBtn: UIButton = {
|
|
|
|
|
|
+ lazy var changeVoiceBtn : UIButton = {
|
|
let btn = UIButton(type: .custom)
|
|
let btn = UIButton(type: .custom)
|
|
btn.setImage(imageInRecordScreenKit(by: "changeVoice_n"), for: .normal)
|
|
btn.setImage(imageInRecordScreenKit(by: "changeVoice_n"), for: .normal)
|
|
btn.setImage(imageInRecordScreenKit(by: "changeVoice_h"), for: .highlighted)
|
|
btn.setImage(imageInRecordScreenKit(by: "changeVoice_h"), for: .highlighted)
|
|
@@ -233,7 +232,7 @@ public class BFRecordScreenController: BFBaseViewController {
|
|
return btn
|
|
return btn
|
|
}()
|
|
}()
|
|
|
|
|
|
- lazy var toolV: BFIntroduceToolView = {
|
|
|
|
|
|
+ lazy var toolV : BFIntroduceToolView = {
|
|
let toolV = BFIntroduceToolView()
|
|
let toolV = BFIntroduceToolView()
|
|
toolV.centerY = view.centerY
|
|
toolV.centerY = view.centerY
|
|
|
|
|
|
@@ -250,14 +249,14 @@ public class BFRecordScreenController: BFBaseViewController {
|
|
}()
|
|
}()
|
|
|
|
|
|
// 头像 add by ak
|
|
// 头像 add by ak
|
|
- lazy var avatarView: BFRecordAvatarView = {
|
|
|
|
|
|
+ lazy var avatarView : BFRecordAvatarView = {
|
|
let avatarView = BFRecordAvatarView(frame: CGRect(x: 10, y: 10, width: 120, height: 120))
|
|
let avatarView = BFRecordAvatarView(frame: CGRect(x: 10, y: 10, width: 120, height: 120))
|
|
avatarView.isHidden = true
|
|
avatarView.isHidden = true
|
|
return avatarView
|
|
return avatarView
|
|
}()
|
|
}()
|
|
|
|
|
|
// 打开摄像头
|
|
// 打开摄像头
|
|
- lazy var openCameraBtn: UIButton = {
|
|
|
|
|
|
+ lazy var openCameraBtn : UIButton = {
|
|
let btn = UIButton(type: .custom)
|
|
let btn = UIButton(type: .custom)
|
|
btn.setImage(imageInRecordScreenKit(by: "openCamera"), for: .normal)
|
|
btn.setImage(imageInRecordScreenKit(by: "openCamera"), for: .normal)
|
|
btn.addTarget(self, action: #selector(openCamera), for: .touchUpInside)
|
|
btn.addTarget(self, action: #selector(openCamera), for: .touchUpInside)
|
|
@@ -265,7 +264,7 @@ public class BFRecordScreenController: BFBaseViewController {
|
|
}()
|
|
}()
|
|
|
|
|
|
// 画笔
|
|
// 画笔
|
|
- lazy var drawPinBtn: UIButton = {
|
|
|
|
|
|
+ lazy var drawPinBtn : UIButton = {
|
|
let btn = UIButton(type: .custom)
|
|
let btn = UIButton(type: .custom)
|
|
btn.setImage(imageInRecordScreenKit(by: "drawPin"), for: .normal)
|
|
btn.setImage(imageInRecordScreenKit(by: "drawPin"), for: .normal)
|
|
btn.addTarget(self, action: #selector(drawPin), for: .touchUpInside)
|
|
btn.addTarget(self, action: #selector(drawPin), for: .touchUpInside)
|
|
@@ -273,7 +272,7 @@ public class BFRecordScreenController: BFBaseViewController {
|
|
}()
|
|
}()
|
|
|
|
|
|
// 字幕设置
|
|
// 字幕设置
|
|
- lazy var subtitleBtn: UIButton = {
|
|
|
|
|
|
+ lazy var subtitleBtn : UIButton = {
|
|
let btn = UIButton(type: .custom)
|
|
let btn = UIButton(type: .custom)
|
|
btn.setImage(imageInRecordScreenKit(by: "subtitleBtn"), for: .normal)
|
|
btn.setImage(imageInRecordScreenKit(by: "subtitleBtn"), for: .normal)
|
|
btn.addTarget(self, action: #selector(subTitleClick), for: .touchUpInside)
|
|
btn.addTarget(self, action: #selector(subTitleClick), for: .touchUpInside)
|
|
@@ -281,7 +280,7 @@ public class BFRecordScreenController: BFBaseViewController {
|
|
}()
|
|
}()
|
|
|
|
|
|
// 声音设置
|
|
// 声音设置
|
|
- lazy var soundSettingBtn: UIButton = {
|
|
|
|
|
|
+ lazy var soundSettingBtn : UIButton = {
|
|
let btn = UIButton(type: .custom)
|
|
let btn = UIButton(type: .custom)
|
|
btn.setImage(imageInRecordScreenKit(by: "soundBtn"), for: .normal)
|
|
btn.setImage(imageInRecordScreenKit(by: "soundBtn"), for: .normal)
|
|
btn.addTarget(self, action: #selector(soundSetting), for: .touchUpInside)
|
|
btn.addTarget(self, action: #selector(soundSetting), for: .touchUpInside)
|
|
@@ -289,14 +288,14 @@ public class BFRecordScreenController: BFBaseViewController {
|
|
}()
|
|
}()
|
|
|
|
|
|
// 字幕设置面板
|
|
// 字幕设置面板
|
|
- lazy var subtitleSettingView: BFSubtitleSettingView = {
|
|
|
|
|
|
+ lazy var subtitleSettingView : BFSubtitleSettingView = {
|
|
let subtitleSetting = BFSubtitleSettingView(frame: CGRect(x: 0, y: 0, width: cScreenWidth, height: cScreenHeigth))
|
|
let subtitleSetting = BFSubtitleSettingView(frame: CGRect(x: 0, y: 0, width: cScreenWidth, height: cScreenHeigth))
|
|
subtitleSetting.isHidden = true
|
|
subtitleSetting.isHidden = true
|
|
return subtitleSetting
|
|
return subtitleSetting
|
|
}()
|
|
}()
|
|
|
|
|
|
// 编辑字幕
|
|
// 编辑字幕
|
|
- lazy var subtitleEditView: BFSubtitleEditView = {
|
|
|
|
|
|
+ lazy var subtitleEditView : BFSubtitleEditView = {
|
|
let subtitleEditView = BFSubtitleEditView(frame: CGRect(x: 0, y: 0, width: cScreenWidth, height: cScreenHeigth))
|
|
let subtitleEditView = BFSubtitleEditView(frame: CGRect(x: 0, y: 0, width: cScreenWidth, height: cScreenHeigth))
|
|
subtitleEditView.isHidden = true
|
|
subtitleEditView.isHidden = true
|
|
|
|
|
|
@@ -304,7 +303,7 @@ public class BFRecordScreenController: BFBaseViewController {
|
|
}()
|
|
}()
|
|
|
|
|
|
// 显示字幕
|
|
// 显示字幕
|
|
- lazy var subtitleLabel: PQSubTitleLabel = {
|
|
|
|
|
|
+ lazy var subtitleLabel : PQSubTitleLabel = {
|
|
let subtitleLabel = PQSubTitleLabel()
|
|
let subtitleLabel = PQSubTitleLabel()
|
|
subtitleLabel.textAlignment = .center
|
|
subtitleLabel.textAlignment = .center
|
|
subtitleLabel.numberOfLines = 0
|
|
subtitleLabel.numberOfLines = 0
|
|
@@ -316,16 +315,16 @@ public class BFRecordScreenController: BFBaseViewController {
|
|
}()
|
|
}()
|
|
|
|
|
|
// 音量设置
|
|
// 音量设置
|
|
- lazy var audioSettingView: BFAudioSettingView = {
|
|
|
|
|
|
+ lazy var audioSettingView : BFAudioSettingView = {
|
|
let audioSettingView = BFAudioSettingView(frame: CGRect(x: 0, y: 0, width: cScreenWidth, height: cScreenHeigth))
|
|
let audioSettingView = BFAudioSettingView(frame: CGRect(x: 0, y: 0, width: cScreenWidth, height: cScreenHeigth))
|
|
audioSettingView.isHidden = true
|
|
audioSettingView.isHidden = true
|
|
return audioSettingView
|
|
return audioSettingView
|
|
}()
|
|
}()
|
|
|
|
|
|
// 录音识别文字
|
|
// 录音识别文字
|
|
- var speechTranscriberUtil: PQSpeechTranscriberUtil?
|
|
|
|
|
|
+ var speechTranscriberUtil : PQSpeechTranscriberUtil?
|
|
|
|
|
|
- lazy var progressThumV: BFVideoThumbProgressView = {
|
|
|
|
|
|
+ lazy var progressThumV : BFVideoThumbProgressView = {
|
|
let vv = BFVideoThumbProgressView(frame: CGRect(x: 0, y: 54, width: cScreenWidth, height: 50))
|
|
let vv = BFVideoThumbProgressView(frame: CGRect(x: 0, y: 54, width: cScreenWidth, height: 50))
|
|
vv.dragStartHandle = { [weak self] in
|
|
vv.dragStartHandle = { [weak self] in
|
|
self?.isDragingProgressSlder = true
|
|
self?.isDragingProgressSlder = true
|
|
@@ -357,7 +356,7 @@ public class BFRecordScreenController: BFBaseViewController {
|
|
return vv
|
|
return vv
|
|
}()
|
|
}()
|
|
|
|
|
|
- lazy var collectionView: UICollectionView = {
|
|
|
|
|
|
+ lazy var collectionView : UICollectionView = {
|
|
let flowLayout = UICollectionViewFlowLayout()
|
|
let flowLayout = UICollectionViewFlowLayout()
|
|
flowLayout.minimumLineSpacing = 0
|
|
flowLayout.minimumLineSpacing = 0
|
|
flowLayout.minimumInteritemSpacing = 0
|
|
flowLayout.minimumInteritemSpacing = 0
|
|
@@ -1431,8 +1430,9 @@ extension BFRecordScreenController: UICollectionViewDelegate, UICollectionViewDa
|
|
progressThumV.isHidden = false
|
|
progressThumV.isHidden = false
|
|
if recordItem.mediaType == .VIDEO {
|
|
if recordItem.mediaType == .VIDEO {
|
|
let currCell: BFImageCoverViewCell? = collectionView.cellForItem(at: IndexPath(item: currItemModelIndex, section: 0)) as? BFImageCoverViewCell
|
|
let currCell: BFImageCoverViewCell? = collectionView.cellForItem(at: IndexPath(item: currItemModelIndex, section: 0)) as? BFImageCoverViewCell
|
|
- setAudioPlay(item: recordItem.playItem)
|
|
|
|
setVideoPlay(item: recordItem.playItem, imageView: currCell?.playView)
|
|
setVideoPlay(item: recordItem.playItem, imageView: currCell?.playView)
|
|
|
|
+ setAudioPlay(item: recordItem.playItem)
|
|
|
|
+ assetPlayer?.seek(to: .zero, toleranceBefore: CMTime(value: 1, timescale: 1000), toleranceAfter: CMTime(value: 1, timescale: 1000))
|
|
}
|
|
}
|
|
if changeItemHandle != nil {
|
|
if changeItemHandle != nil {
|
|
changeItemHandle!(currItemModelIndex)
|
|
changeItemHandle!(currItemModelIndex)
|