123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319 |
- //
- // PQVideoMakeEventTrackModel.swift
- // PQSpeed
- //
- // Created by SanW on 2021/3/3.
- // Copyright © 2021 BytesFlow. All rights reserved.
- //
- import UIKit
- public class PQVideoMakeEventTrackModel: NSObject {
- // 进入创作工具的入口
- public var entrance: videoMakeEntranceType = .entrancePublicTabCompose {
- didSet {
- isPureUploadVideo = entrance == .entrancePublicTabUpload
- isReproduction = entrance == .entranceReproduction
- }
- }
- // 草稿 Id
- public var draftId: String?
- // 项目 Id
- public var projectId: String?
- // 再创作视频的父 projectId - 仅「再创作」视频存在
- public var fatherProjectId: String?
- // 再创作视频的根 projectId - 仅「再创作」视频存在
- public var rootProjectId: String?
- // 再编辑视频的父 draftId - 仅「再编辑」视频存在
- public var fatherDraftId: String?
- // 发布标题
- public var title: String?
- // 发布描述
- public var videoDes: String?
- // 发布封面的 URL
- public var coverUrl: String?
- // 发布的视频 Id
- public var videoId: String?
- /**
- 用户创作视频所用的时间成本,单位:毫秒(ms)
- (仅包含合成前的时间段,不包含合成后选择封面等时间消耗)
- 如果是草稿箱项目,不包含之前累计的时间消耗,仅记录发布这一次的时间消耗
- 如果是再创作项目,不包含别人创作的时间消耗,仅记录发布这一次的时间消耗
- 如果是多次发布的项目,不包含之前累计的时间消耗,仅记录发布这一次的时间消耗
- */
- public var editTimeCost: Float64 = 0
- // 合成视频所用的时间成本,单位:毫秒(ms)
- public var composeTimeCost: Float64 = 0
- // 上传视频所用的时间成本,单位:毫秒(ms)
- public var uploadTimeCost: Float64 = 0
- // 是否为纯上传视频 纯上传视频:true 加工工具视频:false
- public var isPureUploadVideo: Bool = false
- // 是否为再创作视频 再创作视频:true 非再创作视频:false
- public var isReproduction: Bool = false
- // 是否为再编辑视频 再编辑视频:true 非再编辑视频:false
- public var isCopyVideo: Bool = false
- // 段落相关-视频中存在的段落个数:number
- public var sectionNum: Int = 1
- // 文字相关 段落中的文字长度信息:number[] [ section1-text-length, section2-text-length, ... ]
- public var secTextLength: [Int] = Array<Int>.init()
- // 图片 / 视频素材相关 段落中的(本地素材)图片数量:number[] [ section1-localImage-num, section2-localImage-num, ... ]
- public var secLocalImageNum: [Int] = Array<Int>.init()
- // 图片 / 视频素材相关 段落中的(本地素材)动图数量:number[] [ section1-localGif-num, section2-localGif-num, ... ]
- public var secLocalGifNum: [Int] = Array<Int>.init()
- // 图片 / 视频素材相关 段落中的(本地素材)视频数量:number[] [ section1-localVideo-num, section2-localVideo-num, ... ]
- public var secLocalVideoNum: [Int] = Array<Int>.init()
- // 图片/视频素材相关 -段落中的(网络素材)图片数量
- public var secCloudImageNum: [Int] = Array<Int>.init()
- // 图片/视频素材相关 -段落中(网络素材)动图数量
- public var secCloudGifNum: [Int] = Array<Int>.init()
- // 图片/视频素材相关 -段落中(网络素材)视频数量
- public var secCloudVideoNum: [Int] = Array<Int>.init()
- // 文字转语音相关 -段落中使用的语音素材名称,若段落中没有使用则报""
- public var secTextToSpeechMaterial: [String] = Array<String>.init()
- // 文字转语音相关 -段落中文字转语音的毫秒数
- public var secTextToSpeechTime: [Int64] = Array<Int64>.init()
- // 语音转文字相关 -每个段落中使用录音的毫秒数
- public var secSpeechToTextTime: [Int64] = Array<Int64>.init()
- // 开始上传时间
- public var startUploadDate: Float64 = 0
- // 结束上传时间
- public var endUploadDate: Float64 = 0 {
- didSet {
- uploadTimeCost = (endUploadDate - startUploadDate) * 1000
- }
- }
- // 使用音乐的名称(未使用音乐默认为 "")
- public var musicName: String = ""
- // 使用音乐Id
- public var musicId: String = ""
- // 使用音乐的地址(未使用音乐默认为 "")
- public var musicUrl: String = ""
- // 音乐的类型(未使用音乐默认为 "") - original - 原唱 - accompaniment - 伴奏
- public var musicType: String = ""
- // 音乐是否为片段(未使用音乐默认为 "")- true - 音乐片段 - false - 完整音乐
- public var isMusicClip: Bool = false
- // 画布比例
- public var canvasRatio: String = "original"
- // 卡点视频 使用视频素材数量
- public var syncedUpVideoNumber: Int = 0
- // 卡点视频 使用图片素材数量
- public var syncedUpImageNumber: Int = 0
- // 卡点视频 使用音乐Id
- public var syncedUpMusicId: String = ""
- // 卡点视频 使用音乐名称
- public var syncedUpMusicName: String = ""
- // 卡点视频 合成后视频长度(单位:毫秒)
- public var syncedUpVideoDuration: Float64 = 0
- // 卡点视频 原素材总时长(单位:毫秒)视频:报视频时长 图片:一张图报 1000ms
- public var syncedUpOriginalMaterialDuration: Float64 = 0
- // 卡点视频 视频选用节奏名称(快节奏 1、适中 2、慢节奏 3))
- public var syncedUpRhythmNumber: Int = 2
- override init() {
- super.init()
- }
- /// 初始化
- /// - Parameter projectModel: <#projectModel description#>
- init(projectModel: PQEditProjectModel?, reCreateData: PQReCreateModel?) {
- super.init()
- if projectModel != nil {
- draftId = projectModel?.draftboxId
- projectId = projectModel?.projectId
- sectionNum = projectModel?.sData?.sections.count ?? 1
- if projectModel?.sData?.sections != nil, (projectModel?.sData?.sections.count ?? 0) > 0 {
- for section in (projectModel?.sData?.sections)! {
- if section.sectionType == "normal" {
- // 段落中的文字长度信息
- let voiceType: VOICETYPT? = VOICETYPT(rawValue: section.sectionTimeline?.audioTrack?.audioTrackMaterials.first?.voiceType ?? "")
- if voiceType == .SPEECH || voiceType == .LOCAL {
- secTextLength.append(section.getInputSubtitle().count)
- } else {
- secTextLength.append(section.sectionText.count)
- }
- // 段落中使用的语音素材名称
- secTextToSpeechMaterial.append(section.sectionTimeline?.audioTrack?.audioTrackMaterials.first?.produceVoiceConfig?.voice ?? "")
- // 段落中文字转语音的毫秒数
- var duration: Float64 = 0
- if voiceType != nil && section.audioFilePath.count > 0 {
- let audioAsset = AVURLAsset(url: URL(fileURLWithPath: documensDirectory + section.audioFilePath), options: avAssertOptions)
- duration = Float64(audioAsset.duration.seconds * 1000)
- }
- if voiceType == .SPEECH || voiceType == .LOCAL {
- secSpeechToTextTime.append(Int64(duration))
- secTextToSpeechTime.append(0)
- } else {
- secTextToSpeechTime.append(Int64(duration))
- secSpeechToTextTime.append(0)
- }
- // 本地图片数量
- var localImageCount: Int = 0
- // 本地gif数量
- var localGifCount: Int = 0
- // 本地视频数量
- var localVideoCount: Int = 0
- // 网络图片数量
- var netImageCount: Int = 0
- // 网络gif数量
- var netGifCount: Int = 0
- // 网络视频数量
- var netVideoCount: Int = 0
- if section.sectionTimeline?.visionTrack?.visionTrackMaterials != nil, (section.sectionTimeline?.visionTrack?.visionTrackMaterials.count ?? 0) > 0 {
- for visionMaterial in (section.sectionTimeline?.visionTrack?.visionTrackMaterials)! {
- switch visionMaterial.type {
- case "image":
- if visionMaterial.netResCoverImageURL != nil, (visionMaterial.netResCoverImageURL?.count ?? 0) > 0 {
- netImageCount += 1
- } else {
- localImageCount += 1
- }
- case "gif":
- if visionMaterial.netResCoverImageURL != nil, (visionMaterial.netResCoverImageURL?.count ?? 0) > 0 {
- netGifCount += 1
- } else {
- localGifCount += 1
- }
- case "video":
- if visionMaterial.netResUrl.count > 0 {
- netVideoCount += 1
- } else {
- localVideoCount += 1
- }
- default:
- break
- }
- }
- }
- // 本地素材图片数量
- secLocalImageNum.append(localImageCount)
- // 本地素材动图数量
- secLocalGifNum.append(localGifCount)
- // 本地素材视频数量
- secLocalVideoNum.append(localVideoCount)
- // 网络素材图片数量
- secCloudImageNum.append(netImageCount)
- // 网络素材动图数量
- secCloudGifNum.append(netGifCount)
- // 网络素材视频数量
- secCloudVideoNum.append(netVideoCount)
- } else {
- sectionNum = sectionNum - 1
- if sectionNum <= 0 {
- sectionNum = 1
- }
- }
- }
- }
- }
- if reCreateData != nil {
- fatherProjectId = reCreateData?.projectId
- rootProjectId = reCreateData?.rootProjectId ?? reCreateData?.projectId
- fatherDraftId = reCreateData?.draftboxId
- }
- }
- /// 转换为字典
- /// - Returns: <#description#>
- public func toParams() -> [String: Any] {
- var eventTrackDic = Dictionary<String, Any>.init()
- // 进入创作工具的入口
- eventTrackDic["entrance"] = entrance.rawValue
- // 发布的视频 Id
- eventTrackDic["videoId"] = videoId ?? ""
- // 草稿 Id
- eventTrackDic["draftId"] = draftId ?? ""
- // 项目 Id
- eventTrackDic["projectId"] = projectId ?? ""
- // 再创作视频的父 projectId - 仅「再创作」视频存在
- eventTrackDic["fatherProjectId"] = fatherProjectId ?? ""
- // 再创作视频的根 projectId - 仅「再创作」视频存在
- eventTrackDic["rootProjectId"] = rootProjectId ?? ""
- // 再编辑视频的父 draftId - 仅「再编辑」视频存在
- eventTrackDic["fatherDraftId"] = fatherDraftId ?? ""
- // 发布标题
- eventTrackDic["title"] = title ?? ""
- // 发布描述
- eventTrackDic["description"] = videoDes ?? ""
- // 发布封面的 URL
- eventTrackDic["coverUrl"] = coverUrl ?? ""
- /**
- 用户创作视频所用的时间成本,单位:毫秒(ms)
- (仅包含合成前的时间段,不包含合成后选择封面等时间消耗)
- 如果是草稿箱项目,不包含之前累计的时间消耗,仅记录发布这一次的时间消耗
- 如果是再创作项目,不包含别人创作的时间消耗,仅记录发布这一次的时间消耗
- 如果是多次发布的项目,不包含之前累计的时间消耗,仅记录发布这一次的时间消耗
- */
- eventTrackDic["editTimeCost"] = Int64(editTimeCost)
- // 合成视频所用的时间成本,单位:毫秒(ms)
- eventTrackDic["composeTimeCost"] = Int64(composeTimeCost)
- // 上传视频所用的时间成本,单位:毫秒(ms)
- eventTrackDic["uploadTimeCost"] = Int64(uploadTimeCost)
- // 是否为纯上传视频 纯上传视频:true 加工工具视频:false
- eventTrackDic["isPureUploadVideo"] = isPureUploadVideo
- // 是否为再创作视频 再创作视频:true 非再创作视频:false
- eventTrackDic["isReproduction"] = isReproduction
- // 是否为再编辑视频 再编辑视频:true 非再编辑视频:false
- eventTrackDic["isCopyVideo"] = isCopyVideo
- // 段落相关-视频中存在的段落个数:number
- eventTrackDic["sectionNum"] = entrance == .entrancePublicTabUpload ? 0 : sectionNum
- // 文字相关 -段落中的文字长度信息
- eventTrackDic["secTextLength"] = secTextLength
- // 图片/视频素材相关 -段落中的(本地素材)图片数量
- eventTrackDic["secLocalImageNum"] = secLocalImageNum
- // 图片/视频素材相关 -段落中的(本地素材)动图数量
- eventTrackDic["secLocalGifNum"] = secLocalGifNum
- // 图片/视频素材相关 -段落中的(本地素材)视频数量
- eventTrackDic["secLocalVideoNum"] = secLocalVideoNum
- // 图片/视频素材相关 -段落中的(网络素材)图片数量
- eventTrackDic["secCloudImageNum"] = secCloudImageNum
- // 图片/视频素材相关 -段落中(网络素材)动图数量
- eventTrackDic["secCloudGifNum"] = secCloudGifNum
- // 图片/视频素材相关 -段落中(网络素材)视频数量
- eventTrackDic["secCloudVideoNum"] = secCloudVideoNum
- // 文字转语音相关 -段落中使用的语音素材名称,若段落中没有使用则报""
- eventTrackDic["secTextToSpeechMaterial"] = secTextToSpeechMaterial
- // 文字转语音相关 -段落中文字转语音的毫秒数
- eventTrackDic["secTextToSpeechTime"] = secTextToSpeechTime
- // 语音转文字相关 -每个段落中使用录音的毫秒数
- eventTrackDic["secSpeechToTextTime"] = secSpeechToTextTime
- // 实验数据abInfoData
- eventTrackDic["abInfoData"] = dictionaryToJsonString(PQSingletoMemoryUtil.shared.abInfoData) ?? ""
- // 使用音乐的名称(未使用音乐默认为 "")
- eventTrackDic["musicName"] = musicName
- // 使用音乐Id
- eventTrackDic["musicId"] = musicId
- // 使用音乐的地址(未使用音乐默认为 "")
- eventTrackDic["musicUrl"] = musicUrl
- // 音乐的类型(未使用音乐默认为 "") - original - 原唱 - accompaniment - 伴奏
- eventTrackDic["musicType"] = musicType
- // 音乐是否为片段(未使用音乐默认为 "")- true - 音乐片段 - false - 完整音乐
- if musicType.count > 0 {
- eventTrackDic["isMusicClip"] = isMusicClip
- } else {
- eventTrackDic["isMusicClip"] = ""
- }
- // 画布比例
- eventTrackDic["canvasRatio"] = canvasRatio
- // 卡点视频 使用视频素材数量
- eventTrackDic["syncedUpVideoNumber"] = syncedUpVideoNumber
- // 卡点视频 使用图片素材数量
- eventTrackDic["syncedUpImageNumber"] = syncedUpImageNumber
- // 卡点视频 使用音乐Id
- eventTrackDic["syncedUpMusicId"] = syncedUpMusicId
- // 卡点视频 使用音乐名称
- eventTrackDic["syncedUpMusicName"] = syncedUpMusicName
- // 卡点视频 合成后视频长度(单位:毫秒)
- eventTrackDic["syncedUpVideoDuration"] = syncedUpVideoDuration
- // 卡点视频 原素材总时长(单位:毫秒)视频:报视频时长 图片:一张图报 1000ms
- eventTrackDic["syncedUpOriginalMaterialDuration"] = syncedUpOriginalMaterialDuration
- // 卡点视频 视频选用节奏名称(快节奏 1、适中 2、慢节奏 3))
- eventTrackDic["syncedUpRhythmNumber"] = syncedUpRhythmNumber
- BFLog(message: "创作工具埋点信息数据-\(eventTrackDic)")
- return eventTrackDic
- }
- }
|