PQVideoMakeEventTrackModel.swift 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. //
  2. // PQVideoMakeEventTrackModel.swift
  3. // PQSpeed
  4. //
  5. // Created by SanW on 2021/3/3.
  6. // Copyright © 2021 BytesFlow. All rights reserved.
  7. //
  8. import UIKit
  9. public class PQVideoMakeEventTrackModel: NSObject {
  10. // 进入创作工具的入口
  11. public var entrance: videoMakeEntranceType = .entrancePublicTabCompose {
  12. didSet {
  13. isPureUploadVideo = entrance == .entrancePublicTabUpload
  14. isReproduction = entrance == .entranceReproduction
  15. }
  16. }
  17. // 草稿 Id
  18. public var draftId: String?
  19. // 项目 Id
  20. public var projectId: String?
  21. // 再创作视频的父 projectId - 仅「再创作」视频存在
  22. public var fatherProjectId: String?
  23. // 再创作视频的根 projectId - 仅「再创作」视频存在
  24. public var rootProjectId: String?
  25. // 再编辑视频的父 draftId - 仅「再编辑」视频存在
  26. public var fatherDraftId: String?
  27. // 发布标题
  28. public var title: String?
  29. // 发布描述
  30. public var videoDes: String?
  31. // 发布封面的 URL
  32. public var coverUrl: String?
  33. // 发布的视频 Id
  34. public var videoId: String?
  35. /**
  36. 用户创作视频所用的时间成本,单位:毫秒(ms)
  37. (仅包含合成前的时间段,不包含合成后选择封面等时间消耗)
  38. 如果是草稿箱项目,不包含之前累计的时间消耗,仅记录发布这一次的时间消耗
  39. 如果是再创作项目,不包含别人创作的时间消耗,仅记录发布这一次的时间消耗
  40. 如果是多次发布的项目,不包含之前累计的时间消耗,仅记录发布这一次的时间消耗
  41. */
  42. public var editTimeCost: Float64 = 0
  43. // 合成视频所用的时间成本,单位:毫秒(ms)
  44. public var composeTimeCost: Float64 = 0
  45. // 上传视频所用的时间成本,单位:毫秒(ms)
  46. public var uploadTimeCost: Float64 = 0
  47. // 是否为纯上传视频 纯上传视频:true 加工工具视频:false
  48. public var isPureUploadVideo: Bool = false
  49. // 是否为再创作视频 再创作视频:true 非再创作视频:false
  50. public var isReproduction: Bool = false
  51. // 是否为再编辑视频 再编辑视频:true 非再编辑视频:false
  52. public var isCopyVideo: Bool = false
  53. // 段落相关-视频中存在的段落个数:number
  54. public var sectionNum: Int = 1
  55. // 文字相关 段落中的文字长度信息:number[] [​ section1-text-length, section2-text-length, ... ]
  56. public var secTextLength: [Int] = Array<Int>.init()
  57. // 图片 / 视频素材相关 段落中的(本地素材)图片数量:number[] [ section1-localImage-num, section2-localImage-num, ... ]
  58. public var secLocalImageNum: [Int] = Array<Int>.init()
  59. // 图片 / 视频素材相关 段落中的(本地素材)动图数量:number[] [ section1-localGif-num, section2-localGif-num, ... ]
  60. public var secLocalGifNum: [Int] = Array<Int>.init()
  61. // 图片 / 视频素材相关 段落中的(本地素材)视频数量:number[] [ section1-localVideo-num, section2-localVideo-num, ... ]
  62. public var secLocalVideoNum: [Int] = Array<Int>.init()
  63. // 图片/视频素材相关 -段落中的(网络素材)图片数量
  64. public var secCloudImageNum: [Int] = Array<Int>.init()
  65. // 图片/视频素材相关 -段落中(网络素材)动图数量
  66. public var secCloudGifNum: [Int] = Array<Int>.init()
  67. // 图片/视频素材相关 -段落中(网络素材)视频数量
  68. public var secCloudVideoNum: [Int] = Array<Int>.init()
  69. // 文字转语音相关 -段落中使用的语音素材名称,若段落中没有使用则报""
  70. public var secTextToSpeechMaterial: [String] = Array<String>.init()
  71. // 文字转语音相关 -段落中文字转语音的毫秒数
  72. public var secTextToSpeechTime: [Int64] = Array<Int64>.init()
  73. // 语音转文字相关 -每个段落中使用录音的毫秒数
  74. public var secSpeechToTextTime: [Int64] = Array<Int64>.init()
  75. // 开始上传时间
  76. public var startUploadDate: Float64 = 0
  77. // 结束上传时间
  78. public var endUploadDate: Float64 = 0 {
  79. didSet {
  80. uploadTimeCost = (endUploadDate - startUploadDate) * 1000
  81. }
  82. }
  83. // 使用音乐的名称(未使用音乐默认为 "")
  84. public var musicName: String = ""
  85. // 使用音乐Id
  86. public var musicId: String = ""
  87. // 使用音乐的地址(未使用音乐默认为 "")
  88. public var musicUrl: String = ""
  89. // 音乐的类型(未使用音乐默认为 "") - original - 原唱 - accompaniment - 伴奏
  90. public var musicType: String = ""
  91. // 音乐是否为片段(未使用音乐默认为 "")- true - 音乐片段 - false - 完整音乐
  92. public var isMusicClip: Bool = false
  93. // 画布比例
  94. public var canvasRatio: String = "original"
  95. // 卡点视频 使用视频素材数量
  96. public var syncedUpVideoNumber: Int = 0
  97. // 卡点视频 使用图片素材数量
  98. public var syncedUpImageNumber: Int = 0
  99. // 卡点视频 使用音乐Id
  100. public var syncedUpMusicId: String = ""
  101. // 卡点视频 使用音乐名称
  102. public var syncedUpMusicName: String = ""
  103. // 卡点视频 合成后视频长度(单位:毫秒)
  104. public var syncedUpVideoDuration: Float64 = 0
  105. // 卡点视频 原素材总时长(单位:毫秒)视频:报视频时长 图片:一张图报 1000ms
  106. public var syncedUpOriginalMaterialDuration: Float64 = 0
  107. // 卡点视频 视频选用节奏名称(快节奏 1、适中 2、慢节奏 3))
  108. public var syncedUpRhythmNumber: Int = 2
  109. override init() {
  110. super.init()
  111. }
  112. /// 初始化
  113. /// - Parameter projectModel: <#projectModel description#>
  114. init(projectModel: PQEditProjectModel?, reCreateData: PQReCreateModel?) {
  115. super.init()
  116. if projectModel != nil {
  117. draftId = projectModel?.draftboxId
  118. projectId = projectModel?.projectId
  119. sectionNum = projectModel?.sData?.sections.count ?? 1
  120. if projectModel?.sData?.sections != nil, (projectModel?.sData?.sections.count ?? 0) > 0 {
  121. for section in (projectModel?.sData?.sections)! {
  122. if section.sectionType == "normal" {
  123. // 段落中的文字长度信息
  124. let voiceType: VOICETYPT? = VOICETYPT(rawValue: section.sectionTimeline?.audioTrack?.audioTrackMaterials.first?.voiceType ?? "")
  125. if voiceType == .SPEECH || voiceType == .LOCAL {
  126. secTextLength.append(section.getInputSubtitle().count)
  127. } else {
  128. secTextLength.append(section.sectionText.count)
  129. }
  130. // 段落中使用的语音素材名称
  131. secTextToSpeechMaterial.append(section.sectionTimeline?.audioTrack?.audioTrackMaterials.first?.produceVoiceConfig?.voice ?? "")
  132. // 段落中文字转语音的毫秒数
  133. var duration: Float64 = 0
  134. if voiceType != nil && section.audioFilePath.count > 0 {
  135. let audioAsset = AVURLAsset(url: URL(fileURLWithPath: documensDirectory + section.audioFilePath), options: avAssertOptions)
  136. duration = Float64(audioAsset.duration.seconds * 1000)
  137. }
  138. if voiceType == .SPEECH || voiceType == .LOCAL {
  139. secSpeechToTextTime.append(Int64(duration))
  140. secTextToSpeechTime.append(0)
  141. } else {
  142. secTextToSpeechTime.append(Int64(duration))
  143. secSpeechToTextTime.append(0)
  144. }
  145. // 本地图片数量
  146. var localImageCount: Int = 0
  147. // 本地gif数量
  148. var localGifCount: Int = 0
  149. // 本地视频数量
  150. var localVideoCount: Int = 0
  151. // 网络图片数量
  152. var netImageCount: Int = 0
  153. // 网络gif数量
  154. var netGifCount: Int = 0
  155. // 网络视频数量
  156. var netVideoCount: Int = 0
  157. if section.sectionTimeline?.visionTrack?.visionTrackMaterials != nil, (section.sectionTimeline?.visionTrack?.visionTrackMaterials.count ?? 0) > 0 {
  158. for visionMaterial in (section.sectionTimeline?.visionTrack?.visionTrackMaterials)! {
  159. switch visionMaterial.type {
  160. case "image":
  161. if visionMaterial.netResCoverImageURL != nil, (visionMaterial.netResCoverImageURL?.count ?? 0) > 0 {
  162. netImageCount += 1
  163. } else {
  164. localImageCount += 1
  165. }
  166. case "gif":
  167. if visionMaterial.netResCoverImageURL != nil, (visionMaterial.netResCoverImageURL?.count ?? 0) > 0 {
  168. netGifCount += 1
  169. } else {
  170. localGifCount += 1
  171. }
  172. case "video":
  173. if visionMaterial.netResUrl.count > 0 {
  174. netVideoCount += 1
  175. } else {
  176. localVideoCount += 1
  177. }
  178. default:
  179. break
  180. }
  181. }
  182. }
  183. // 本地素材图片数量
  184. secLocalImageNum.append(localImageCount)
  185. // 本地素材动图数量
  186. secLocalGifNum.append(localGifCount)
  187. // 本地素材视频数量
  188. secLocalVideoNum.append(localVideoCount)
  189. // 网络素材图片数量
  190. secCloudImageNum.append(netImageCount)
  191. // 网络素材动图数量
  192. secCloudGifNum.append(netGifCount)
  193. // 网络素材视频数量
  194. secCloudVideoNum.append(netVideoCount)
  195. } else {
  196. sectionNum = sectionNum - 1
  197. if sectionNum <= 0 {
  198. sectionNum = 1
  199. }
  200. }
  201. }
  202. }
  203. }
  204. if reCreateData != nil {
  205. fatherProjectId = reCreateData?.projectId
  206. rootProjectId = reCreateData?.rootProjectId ?? reCreateData?.projectId
  207. fatherDraftId = reCreateData?.draftboxId
  208. }
  209. }
  210. /// 转换为字典
  211. /// - Returns: <#description#>
  212. public func toParams() -> [String: Any] {
  213. var eventTrackDic = Dictionary<String, Any>.init()
  214. // 进入创作工具的入口
  215. eventTrackDic["entrance"] = entrance.rawValue
  216. // 发布的视频 Id
  217. eventTrackDic["videoId"] = videoId ?? ""
  218. // 草稿 Id
  219. eventTrackDic["draftId"] = draftId ?? ""
  220. // 项目 Id
  221. eventTrackDic["projectId"] = projectId ?? ""
  222. // 再创作视频的父 projectId - 仅「再创作」视频存在
  223. eventTrackDic["fatherProjectId"] = fatherProjectId ?? ""
  224. // 再创作视频的根 projectId - 仅「再创作」视频存在
  225. eventTrackDic["rootProjectId"] = rootProjectId ?? ""
  226. // 再编辑视频的父 draftId - 仅「再编辑」视频存在
  227. eventTrackDic["fatherDraftId"] = fatherDraftId ?? ""
  228. // 发布标题
  229. eventTrackDic["title"] = title ?? ""
  230. // 发布描述
  231. eventTrackDic["description"] = videoDes ?? ""
  232. // 发布封面的 URL
  233. eventTrackDic["coverUrl"] = coverUrl ?? ""
  234. /**
  235. 用户创作视频所用的时间成本,单位:毫秒(ms)
  236. (仅包含合成前的时间段,不包含合成后选择封面等时间消耗)
  237. 如果是草稿箱项目,不包含之前累计的时间消耗,仅记录发布这一次的时间消耗
  238. 如果是再创作项目,不包含别人创作的时间消耗,仅记录发布这一次的时间消耗
  239. 如果是多次发布的项目,不包含之前累计的时间消耗,仅记录发布这一次的时间消耗
  240. */
  241. eventTrackDic["editTimeCost"] = Int64(editTimeCost)
  242. // 合成视频所用的时间成本,单位:毫秒(ms)
  243. eventTrackDic["composeTimeCost"] = Int64(composeTimeCost)
  244. // 上传视频所用的时间成本,单位:毫秒(ms)
  245. eventTrackDic["uploadTimeCost"] = Int64(uploadTimeCost)
  246. // 是否为纯上传视频 纯上传视频:true 加工工具视频:false
  247. eventTrackDic["isPureUploadVideo"] = isPureUploadVideo
  248. // 是否为再创作视频 再创作视频:true 非再创作视频:false
  249. eventTrackDic["isReproduction"] = isReproduction
  250. // 是否为再编辑视频 再编辑视频:true 非再编辑视频:false
  251. eventTrackDic["isCopyVideo"] = isCopyVideo
  252. // 段落相关-视频中存在的段落个数:number
  253. eventTrackDic["sectionNum"] = entrance == .entrancePublicTabUpload ? 0 : sectionNum
  254. // 文字相关 -段落中的文字长度信息
  255. eventTrackDic["secTextLength"] = secTextLength
  256. // 图片/视频素材相关 -段落中的(本地素材)图片数量
  257. eventTrackDic["secLocalImageNum"] = secLocalImageNum
  258. // 图片/视频素材相关 -段落中的(本地素材)动图数量
  259. eventTrackDic["secLocalGifNum"] = secLocalGifNum
  260. // 图片/视频素材相关 -段落中的(本地素材)视频数量
  261. eventTrackDic["secLocalVideoNum"] = secLocalVideoNum
  262. // 图片/视频素材相关 -段落中的(网络素材)图片数量
  263. eventTrackDic["secCloudImageNum"] = secCloudImageNum
  264. // 图片/视频素材相关 -段落中(网络素材)动图数量
  265. eventTrackDic["secCloudGifNum"] = secCloudGifNum
  266. // 图片/视频素材相关 -段落中(网络素材)视频数量
  267. eventTrackDic["secCloudVideoNum"] = secCloudVideoNum
  268. // 文字转语音相关 -段落中使用的语音素材名称,若段落中没有使用则报""
  269. eventTrackDic["secTextToSpeechMaterial"] = secTextToSpeechMaterial
  270. // 文字转语音相关 -段落中文字转语音的毫秒数
  271. eventTrackDic["secTextToSpeechTime"] = secTextToSpeechTime
  272. // 语音转文字相关 -每个段落中使用录音的毫秒数
  273. eventTrackDic["secSpeechToTextTime"] = secSpeechToTextTime
  274. // 实验数据abInfoData
  275. eventTrackDic["abInfoData"] = dictionaryToJsonString(PQSingletoMemoryUtil.shared.abInfoData) ?? ""
  276. // 使用音乐的名称(未使用音乐默认为 "")
  277. eventTrackDic["musicName"] = musicName
  278. // 使用音乐Id
  279. eventTrackDic["musicId"] = musicId
  280. // 使用音乐的地址(未使用音乐默认为 "")
  281. eventTrackDic["musicUrl"] = musicUrl
  282. // 音乐的类型(未使用音乐默认为 "") - original - 原唱 - accompaniment - 伴奏
  283. eventTrackDic["musicType"] = musicType
  284. // 音乐是否为片段(未使用音乐默认为 "")- true - 音乐片段 - false - 完整音乐
  285. if musicType.count > 0 {
  286. eventTrackDic["isMusicClip"] = isMusicClip
  287. } else {
  288. eventTrackDic["isMusicClip"] = ""
  289. }
  290. // 画布比例
  291. eventTrackDic["canvasRatio"] = canvasRatio
  292. // 卡点视频 使用视频素材数量
  293. eventTrackDic["syncedUpVideoNumber"] = syncedUpVideoNumber
  294. // 卡点视频 使用图片素材数量
  295. eventTrackDic["syncedUpImageNumber"] = syncedUpImageNumber
  296. // 卡点视频 使用音乐Id
  297. eventTrackDic["syncedUpMusicId"] = syncedUpMusicId
  298. // 卡点视频 使用音乐名称
  299. eventTrackDic["syncedUpMusicName"] = syncedUpMusicName
  300. // 卡点视频 合成后视频长度(单位:毫秒)
  301. eventTrackDic["syncedUpVideoDuration"] = syncedUpVideoDuration
  302. // 卡点视频 原素材总时长(单位:毫秒)视频:报视频时长 图片:一张图报 1000ms
  303. eventTrackDic["syncedUpOriginalMaterialDuration"] = syncedUpOriginalMaterialDuration
  304. // 卡点视频 视频选用节奏名称(快节奏 1、适中 2、慢节奏 3))
  305. eventTrackDic["syncedUpRhythmNumber"] = syncedUpRhythmNumber
  306. BFLog(message: "创作工具埋点信息数据-\(eventTrackDic)")
  307. return eventTrackDic
  308. }
  309. }