Quellcode durchsuchen

Merge branch 'master' of https://git.yishihui.com/iOS/BFFramework

wenweiwei vor 3 Jahren
Ursprung
Commit
0e73ccd738

+ 169 - 149
BFFramework/Classes/Enums/Enums.swift

@@ -42,170 +42,178 @@ public  enum  PQVIDEO_PLAY_STATUS {
 /// 页面场景
 public  enum  PAGESOURCE: String {
     /*************** 视频相关pageSource ***************/
-    case sp_category = "speedApp-category" //   首页-单列
-    case sp_category_recommend = "speedApp-category_recommend" // 由首页单列右划
-    case sp_categoryDouble = "speedApp-categoryDouble" // 首页-双列
-    case sp_videoDetail = "speedApp-videoDetail" // 视频详情页
-    case sp_videoDetail_search = "speedApp-videoDetail_search" //    由搜索结果列表进入
-    case sp_videoDetail_search_recommend = "speedApp-videoDetail_search_recommend" // 由搜索结果列表进入
-    case sp_videoDetail_upload = "speedApp-videoDetail_upload" //     由我的tab中“作品”列表进入
-    case sp_videoDetail_upload_recommend = "speedApp-videoDetail_upload_recommend" // 、由我的tab中“作品”列表进入
-    case sp_videoDetail_favorite = "speedApp-videoDetail_favorite" // 由我的喜欢列表进入
-    case sp_videoDetail_share = "speedApp-videoDetail_share" // 由我的分享列表进入
-    case sp_videoDetail_favorite_recommend = "speedApp-videoDetail_favorite_recommend" // 由我的喜欢列表推荐
-    case sp_userHomePage = "speedApp-userHomePage" // 用户个人主页
-    case sp_videoDetail_userHomePage = "speedApp-videoDetail_userHomePage" // 由用户个人主页进入
-    case sp_videoDetail_userHomePage_recommend = "speedApp-videoDetail_userHomePage_recommend" // 由用户个人主页进入
-    case sp_recommendBottom = "speedApp-recommendBottom" //    底部展示的3个相关推荐视频
-    case sp_follow = "speedApp-follow" // 关注tab
-    case sp_follow_recommend = "speedApp-follow_recommend" // 由关注列表右划
-    case sp_followSingle = "speedApp-followSingle" // 关注tab点击顶部个人头像进入某个人的关注
-    case sp_followSingle_recommend = "speedApp-followSingle_recommend" // 关注tab点击顶部个人头像进入某个人的关注
-    case sp_mine = "speedApp-mine" // 我的tab
-    case sp_search = "speedApp-search" // 搜索页
-    case sp_uploadVideo = "speedApp-uploadVideo" // 视频制作入口
+    case sp_category = "shanyinApp-category" //   首页-单列
+    case sp_category_recommend = "shanyinApp-category_recommend" // 由首页单列右划
+    case sp_categoryDouble = "shanyinApp-categoryDouble" // 首页-双列
+    case sp_videoDetail = "shanyinApp-videoDetail" // 视频详情页
+    case sp_videoDetail_search = "shanyinApp-videoDetail_search" //    由搜索结果列表进入
+    case sp_videoDetail_search_recommend = "shanyinApp-videoDetail_search_recommend" // 由搜索结果列表进入
+    case sp_videoDetail_upload = "shanyinApp-videoDetail_upload" //     由我的tab中“作品”列表进入
+    case sp_videoDetail_upload_recommend = "shanyinApp-videoDetail_upload_recommend" // 、由我的tab中“作品”列表进入
+    case sp_videoDetail_favorite = "shanyinApp-videoDetail_favorite" // 由我的喜欢列表进入
+    case sp_videoDetail_share = "shanyinApp-videoDetail_share" // 由我的分享列表进入
+    case sp_videoDetail_favorite_recommend = "shanyinApp-videoDetail_favorite_recommend" // 由我的喜欢列表推荐
+    case sp_userHomePage = "shanyinApp-userHomePage" // 用户个人主页
+    case sp_videoDetail_userHomePage = "shanyinApp-videoDetail_userHomePage" // 由用户个人主页进入
+    case sp_videoDetail_userHomePage_recommend = "shanyinApp-videoDetail_userHomePage_recommend" // 由用户个人主页进入
+    case sp_recommendBottom = "shanyinApp-recommendBottom" //    底部展示的3个相关推荐视频
+    case sp_follow = "shanyinApp-follow" // 关注tab
+    case sp_follow_recommend = "shanyinApp-follow_recommend" // 由关注列表右划
+    case sp_followSingle = "shanyinApp-followSingle" // 关注tab点击顶部个人头像进入某个人的关注
+    case sp_followSingle_recommend = "shanyinApp-followSingle_recommend" // 关注tab点击顶部个人头像进入某个人的关注
+//    case sp_mine = "shanyinApp-mine" // 我的tab
+    case sp_search = "shanyinApp-search" // 搜索页
+    case sp_uploadVideo = "shanyinApp-uploadVideo" // 视频制作入口
 
     /*************** 活动相关pageSource ***************/
-    case sp_activity_entranceButton = "speedApp_playActivity_entranceButton" // 活动活动入口按键
-    case sp_activity_invite = "speedApp_playActivity_invite" // H5页面内邀请好友按键
-    case sp_activity_threeDot = "speedApp_playActivity_threeDot" // APP右上角…按键
-    case sp_activity_shareFriend = "speedApp_playActivity_shareFriend" // 进一步点击分享好友
-    case sp_activity_shareMoment = "speedApp_playActivity_shareMoment" // 进一步点击分享朋友圈
-    case sp_activity_openH5 = "speedApp_playActivity_completeOpenH5" // 当天完成活动的弹窗->去查看
-    case sp_activity_openH5AndPayment = "speedApp_playActivity_completeOpenH5AndPayment" // 当天完成活动的弹窗->报名明日
-    case sp_activity_failOpenH5 = "speedApp_playActivity_missionFailWindowOpenH5" // 未成功弹窗->继续活动
-    case sp_activity_success_share = "speedApp_playActivity_missionSuccessWindow_share" // 成功弹窗->分享给好友炫耀下
-    case sp_activity_entrance_close = "speedApp_playActivity_entrance_close" // 活动入口弹窗->关闭按钮
-    case sp_activity_entranceWindow = "speedApp_playActivity_entranceWindow" // 活动入口弹窗
-    case sp_activity_successWindow = "speedApp_playActivity_missionSuccessWindow" // 成功弹窗
-    case sp_activity_failWindow = "speedApp_playActivity_missionFailWindow" // 未成功弹窗
-    case sp_activity_completeWindow = "speedApp_playActivity_missionCompleteWindow" //  当天完成活动的弹窗
+    case sp_activity_entranceButton = "shanyinApp_playActivity_entranceButton" // 活动活动入口按键
+    case sp_activity_invite = "shanyinApp_playActivity_invite" // H5页面内邀请好友按键
+    case sp_activity_threeDot = "shanyinApp_playActivity_threeDot" // APP右上角…按键
+    case sp_activity_shareFriend = "shanyinApp_playActivity_shareFriend" // 进一步点击分享好友
+    case sp_activity_shareMoment = "shanyinApp_playActivity_shareMoment" // 进一步点击分享朋友圈
+    case sp_activity_openH5 = "shanyinApp_playActivity_completeOpenH5" // 当天完成活动的弹窗->去查看
+    case sp_activity_openH5AndPayment = "shanyinApp_playActivity_completeOpenH5AndPayment" // 当天完成活动的弹窗->报名明日
+    case sp_activity_failOpenH5 = "shanyinApp_playActivity_missionFailWindowOpenH5" // 未成功弹窗->继续活动
+    case sp_activity_success_share = "shanyinApp_playActivity_missionSuccessWindow_share" // 成功弹窗->分享给好友炫耀下
+    case sp_activity_entrance_close = "shanyinApp_playActivity_entrance_close" // 活动入口弹窗->关闭按钮
+    case sp_activity_entranceWindow = "shanyinApp_playActivity_entranceWindow" // 活动入口弹窗
+    case sp_activity_successWindow = "shanyinApp_playActivity_missionSuccessWindow" // 成功弹窗
+    case sp_activity_failWindow = "shanyinApp_playActivity_missionFailWindow" // 未成功弹窗
+    case sp_activity_completeWindow = "shanyinApp_playActivity_missionCompleteWindow" //  当天完成活动的弹窗
 
     /*************** 上传相关pageSource ***************/
-    case sp_upload_videoSelect = "speedApp-upload_videoSelect" //  选视频-进入页面事件
-    case sp_upload_coverSelect = "speedApp-upload_coverSelect" //  选封面-进入页面事件
-    case sp_upload_videoPublish = "speedApp-upload_videoPublish" //  发布-进入页面事件
+    case sp_upload_videoSelect = "shanyinApp-upload_videoSelect" //  选视频-进入页面事件
+    case sp_upload_coverSelect = "shanyinApp-upload_coverSelect" //  选封面-进入页面事件
+    case sp_upload_videoPublish = "shanyinApp-upload_videoPublish" //  发布-进入页面事件
 
     /*************** tab点击相关pageSource ***************/
-    case sp_categoryTabButton = "speedApp-categoryTabButton" //  首页tab
-    case sp_followTabButton = "speedApp-followTabButton" //  关注tab
-    case sp_uploadTabButton = "speedApp-uploadTabButton" //  上传tab
-    case sp_mineTabButton = "speedApp-mineTabButton" //  我的tab
-    case sp_msg_tabBtn = "speedApp_msgTabButton" //  消息tab
+    case sp_categoryTabButton = "shanyinApp-categoryTabButton" //  首页tab
+    case sp_followTabButton = "shanyinApp-followTabButton" //  关注tab
+    case sp_uploadTabButton = "shanyinApp-uploadTabButton" //  上传tab
+    case sp_mineTabButton = "shanyinApp-mineTabButton" //  我的tab
+    case sp_msg_tabBtn = "shanyinApp_msgTabButton" //  消息tab
 
     /*************** 发布pageSource ***************/
-    case sp_videoMaking = "speedApp-videoMaking" // 视频创作
-    case sp_videoCompose_guid = "speedApp-videoCompose_guid" // 预览页面
-    case sp_videoCompose_edit = "speedApp-videoCompose_edit" // 编辑页面
-    case sp_videoCompose_overview = "speedApp-videoCompose_overview" // 总览页面
-    case sp_videoCompose_composition = "speedApp-videoCompose_composition" // 合成页面
+    case sp_videoMaking = "shanyinApp-videoMaking" // 视频创作
+    case sp_videoCompose_guid = "shanyinApp-videoCompose_guid" // 预览页面
+    case sp_videoCompose_edit = "shanyinApp-videoCompose_edit" // 编辑页面
+    case sp_videoCompose_overview = "shanyinApp-videoCompose_overview" // 总览页面
+    case sp_videoCompose_composition = "shanyinApp-videoCompose_composition" // 合成页面
     case sp_material_search = "vlog-pages/user-videos-share" // 素材搜索上报
 
     /*************** 消息pageSource ***************/
-    case sp_msg_shareSpace = "speedApp-message" // 分享空间
-    case sp_msg_shareSpace_detail = "speedApp-message_shareSpace" // 分享空间详情
-    case sp_msg_share = "speedApp-message_share" // 分享
-    case sp_msg_like = "speedApp-message_like" // 喜欢
-    case sp_msg_fans = "speedApp-message_fans" // 粉丝
-    case sp_msg_push = "speedApp-message_push" // 通知
+    case sp_msg_shareSpace = "shanyinApp-message" // 分享空间
+    case sp_msg_shareSpace_detail = "shanyinApp-message_shareSpace" // 分享空间详情
+    case sp_msg_share = "shanyinApp-message_share" // 分享
+    case sp_msg_like = "shanyinApp-message_like" // 喜欢
+    case sp_msg_fans = "shanyinApp-message_fans" // 粉丝
+    case sp_msg_push = "shanyinApp-message_push" // 通知
 
     /*************** 草稿箱相关pageSource ***************/
-    case sp_draft_projectList = "speedApp-projectList" // 草稿箱列表
-    case sp_reproduce_childList = "speedApp-reproduceCollection_child" // 再制作子列表页面
-    case sp_reproduce_fatherList = "speedApp-reproduceCollection_father" // 再制作父列表页面
-    case sp_reproduce_chilDetailList = "speedApp-videoDetail_reproduceCollection_child" // 再制作子列表页面
-    case sp_reproduce_fatherDetailList = "speedApp-videoDetail_reproduceCollection_father" // 再制作父列表页面
+    case sp_draft_projectList = "shanyinApp-projectList" // 草稿箱列表
+    case sp_reproduce_childList = "shanyinApp-reproduceCollection_child" // 再制作子列表页面
+    case sp_reproduce_fatherList = "shanyinApp-reproduceCollection_father" // 再制作父列表页面
+    case sp_reproduce_chilDetailList = "shanyinApp-videoDetail_reproduceCollection_child" // 再制作子列表页面
+    case sp_reproduce_fatherDetailList = "shanyinApp-videoDetail_reproduceCollection_father" // 再制作父列表页面
     // add by ak
-    case sp_speedApp_upload2Compose = "speedApp-upload2Compose" // 上传转创作
+    case sp_speedApp_upload2Compose = "shanyinApp-upload2Compose" // 上传转创作
 
     /*************** 卡点视频相关pageSource ***************/
-    case sp_stuck_selectMaterial = "speedApp-selectSyncedUpMaterial" // 卡点视频素材选择页
-    case sp_stuck_selectSynceedUpMusic = "speedApp-selectSynceedUpMusic" // 卡点视频音乐选择页
-    case sp_stuck_previewSyncedUp = "speedApp_previewSyncedUp" // 预览页面曝光上报
-    case sp_stuck_searchSyncedUpMusic = "speedApp_searchSyncedUpMusic" // 音乐素材搜索页
-    case sp_stuck_publishSyncedUp = "speedApp_publishSyncedUp" // 合成发布页
+    case sp_stuck_selectMaterial = "shanyinApp-selectSyncedUpMaterial" // 卡点视频素材选择页
+    case sp_stuck_selectSynceedUpMusic = "shanyinApp-selectSynceedUpMusic" // 卡点视频音乐选择页
+    case sp_stuck_previewSyncedUp = "shanyinApp_previewSyncedUp" // 预览页面曝光上报
+    case sp_stuck_searchSyncedUpMusic = "shanyinApp_searchSyncedUpMusic" // 音乐素材搜索页
+    case sp_stuck_publishSyncedUp = "shanyinApp_publishSyncedUp" // 合成发布页
+    
+    //点击上报:首页点击底部“我的”页面入口
+    case sp_shanyinApp_main = "shanyinApp-main"
+    //页面曝光上报:“我的”页面曝光
+    case sp_shanyinApp_mine = "shanyinApp-mine"
+    
+    
 }
 
 // MARK: - objectType
-
+var ssss = "sssss"
+let ot_home_tabBtn:String = "\(ssss)xxxxxx"
 /// objectType
 public  enum  objectType: String {
     /*************** tab点击相关pageSource ***************/
 
-    case ot_home_tabBtn = "speedApp-categoryTabButton" //  首页tab
-    case ot_follow_tabBtn = "speedApp-followTabButton" //  关注tab
-    case ot_up_tabBtn = "speedApp-uploadTabButton" //  上传tab
-    case ot_mine_tabBtn = "speedApp-mineTabButton" //  我的tab
-    case ot_public_tabBtn = "speedApp-publicTabButton" //  发布tab
-    case ot_msg_tabBtn = "speedApp_msgTabButton" //  消息tab
+    case ot_home_tabBtn = "shanyinApp-categoryTabButton" //  首页tab
+    case ot_follow_tabBtn = "shanyinApp-followTabButton" //  关注tab
+    case ot_up_tabBtn = "shanyinApp-uploadTabButton" //  上传tab
+    case ot_mine_tabBtn = "shanyinApp-mineTabButton" //  我的tab
+    case ot_public_tabBtn = "shanyinApp-publicTabButton" //  发布tab
+    case ot_msg_tabBtn = "shanyinApp_msgTabButton" //  消息tab
 
     /*************** 上传相关objectType ***************/
-    case ot_up_backBtn = "speedApp-uploadBackButton" // 点击左下角叉子
-    case ot_up_nextBtn = "speedApp-uploadNextButton" // 点击右下角下一步
-    case ot_up_coverBtn = "speedApp-uploadCoverButton" // 点击上传封面
-    case ot_up_pickCoverBtn = "speedApp-pickCoverButton" // 点击截取封面
-    case ot_up_publishBtn = "speedApp-videoPublishButton" // 点击发布
-    case ot_up_changeCoverBtn = "speedApp-changeCoverButton" // 点击选封面返回
-    case ot_up_start = "speedApp-uploadStart" // 上传开始事件
-    case ot_up_fail = "speedApp-uploadFail" // 上传中断/失败事件
-    case ot_up_restart = "speedApp-uploadRestart" // 上传重试事件
-    case ot_up_success = "speedApp-uploadSuccess" // 上传完成
-    case ot_up_publishSuccess = "speedApp-videoPublishSuccess" // 发布完成
-    case ot_up_viewPopup_guideUsersToShare = "speedApp_viewPopup_guideUsersToShare_pubishVideo" // 发布成功弹出分享界面
-    case ot_up_clickWechatMoments_guideUsersToShare = "speedApp_clickWechatMoments_guideUsersToShare_pubishVideo" // 分享介面点击微信朋友圈
-    case ot_up_clickWechat_guideUsersToShare = "speedApp_clickWechat_guideUsersToShare_pubishVideo"
-    case ot_selectVideoProductionMode = "speedApp_viewWindow_selectVideoProductionMode"
+    case ot_up_backBtn = "shanyinApp-uploadBackButton" // 点击左下角叉子
+    case ot_up_nextBtn = "shanyinApp-uploadNextButton" // 点击右下角下一步
+    case ot_up_coverBtn = "shanyinApp-uploadCoverButton" // 点击上传封面
+    case ot_up_pickCoverBtn = "shanyinApp-pickCoverButton" // 点击截取封面
+    case ot_up_publishBtn = "shanyinApp-videoPublishButton" // 点击发布
+    case ot_up_changeCoverBtn = "shanyinApp-changeCoverButton" // 点击选封面返回
+    case ot_up_start = "shanyinApp-uploadStart" // 上传开始事件
+    case ot_up_fail = "shanyinApp-uploadFail" // 上传中断/失败事件
+    case ot_up_restart = "shanyinApp-uploadRestart" // 上传重试事件
+    case ot_up_success = "shanyinApp-uploadSuccess" // 上传完成
+    case ot_up_publishSuccess = "shanyinApp-videoPublishSuccess" // 发布完成
+    case ot_up_viewPopup_guideUsersToShare = "shanyinApp_viewPopup_guideUsersToShare_pubishVideo" // 发布成功弹出分享界面
+    case ot_up_clickWechatMoments_guideUsersToShare = "shanyinApp_clickWechatMoments_guideUsersToShare_pubishVideo" // 分享介面点击微信朋友圈
+    case ot_up_clickWechat_guideUsersToShare = "shanyinApp_clickWechat_guideUsersToShare_pubishVideo"
+    case ot_selectVideoProductionMode = "shanyinApp_viewWindow_selectVideoProductionMode"
     // 分享界面点击微信好友
     /*************** 创作工具相关objectType ***************/
     case ot_makevideo_video = "video" // 视频
     case ot_makevideo_gif = "gif" // 动态图
     case ot_makevideo_jpg = "jpg" // 图片
-    case ot_enterComposeToolButton = "speedApp_enterComposeToolButton" // 点击上传tab后-点击发布视频 add by ak & 视频合成入口
-    case ot_enterVideoUploadButton = "speedApp_enterVideoUploadButton" // 点击上传tab后-点击上传视频
-    case ot_videoCompose_overviewButton = "speedApp_videoCompose_overviewButton" // 点击总览
-    case ot_videoCompose_videoCompositeButton = "speedApp_videoCompose_videoCompositeButton" // 点击去发布
-    case ot_videoCompose_videoPublish = "speedApp_videoPublishButton" // 发布视频
-    case ot_speedApp_searchButton = "speedApp_searchButton" // 发布视频
+    case ot_enterComposeToolButton = "shanyinApp_enterComposeToolButton" // 点击上传tab后-点击发布视频 add by ak & 视频合成入口
+    case ot_enterVideoUploadButton = "shanyinApp_enterVideoUploadButton" // 点击上传tab后-点击上传视频
+    case ot_videoCompose_overviewButton = "shanyinApp_videoCompose_overviewButton" // 点击总览
+    case ot_videoCompose_videoCompositeButton = "shanyinApp_videoCompose_videoCompositeButton" // 点击去发布
+    case ot_videoCompose_videoPublish = "shanyinApp_videoPublishButton" // 发布视频
+    case ot_speedApp_searchButton = "shanyinApp_searchButton" // 发布视频
     case ot_pageView = "pageView" // 页面访问
     //
     // 图文入口
-    case ot_speedApp_clickButton_imageAndTextGenerateVideo = "speedApp_clickButton_imageAndTextGenerateVideo"
+    case ot_speedApp_clickButton_imageAndTextGenerateVideo = "shanyinApp_clickButton_imageAndTextGenerateVideo"
     // 电子相册
-    case ot_speedApp_clickButton_electronicAlbum = "speedApp_clickButton_electronicAlbum"
+    case ot_speedApp_clickButton_electronicAlbum = "shanyinApp_clickButton_electronicAlbum"
     /*************** 消息相关objectType ***************/
-    case ot_msg_fansMsgButton = "speedApp_msgTab_fansMsgButton" //  粉丝消息入口
-    case ot_msg_likeMsgButton = "speedApp_msgTab_likeMsgButton" //  喜欢消息入口
-    case ot_msg_shareMsgButton = "speedApp_msgTab_shareMsgButton" //  分享消息入口
-    case ot_msg_commentMsgButton = "speedApp_msgTab_commentMsgButton" //  评论消息入口
-    case ot_msg_systemMsgButton = "speedApp_msgTab_systemMsgButton" //  通知消息入口
+    case ot_msg_fansMsgButton = "shanyinApp_msgTab_fansMsgButton" //  粉丝消息入口
+    case ot_msg_likeMsgButton = "shanyinApp_msgTab_likeMsgButton" //  喜欢消息入口
+    case ot_msg_shareMsgButton = "shanyinApp_msgTab_shareMsgButton" //  分享消息入口
+    case ot_msg_commentMsgButton = "shanyinApp_msgTab_commentMsgButton" //  评论消息入口
+    case ot_msg_systemMsgButton = "shanyinApp_msgTab_systemMsgButton" //  通知消息入口
 
     /*************** 消息详情相关objectType ***************/
-    case ot_msg_shareSpaceViewTab = "speedApp_message_shareSpace_viewTab" // 分享空间详情页观看
-    case ot_msg_shareSpaceLikeTab = "speedApp_message_shareSpace_likeTab" // 分享空间详情页喜欢
-    case ot_msg_shareSpaceCommentTab = "speedApp_message_shareSpace_commentTab" // 分享空间详情页评论
-    case ot_msg_shareSpaceShareTab = "speedApp_message_shareSpace_shareTab" // 分享空间详情页分享
+    case ot_msg_shareSpaceViewTab = "shanyinApp_message_shareSpace_viewTab" // 分享空间详情页观看
+    case ot_msg_shareSpaceLikeTab = "shanyinApp_message_shareSpace_likeTab" // 分享空间详情页喜欢
+    case ot_msg_shareSpaceCommentTab = "shanyinApp_message_shareSpace_commentTab" // 分享空间详情页评论
+    case ot_msg_shareSpaceShareTab = "shanyinApp_message_shareSpace_shareTab" // 分享空间详情页分享
 
     /*************** 草稿箱相关objectType ***************/
-    case ot_draft_clicktButton = "speedApp_clickOpenProjectListButton" // 草稿箱点击入口
-    case ot_draft_editProject = "speedApp_editProject" // - 点击 Project Item(草稿箱中的每个项目)
-    case ot_draft_viewProject = "speedApp_viewProject" // - 看到 Project Item(草稿箱中的每个项目)
-    case ot_draft_clickEditProject = "speedApp_clickEditProject" // - 点击 Project Item 弹出菜单的「编辑」按钮
-    case ot_draft_clickPublishProject = "speedApp_clickPublishProject" // - 点击 Project Item 弹出菜单的「去发布」按钮
-    case ot_draft_clickRenameProject = "speedApp_clickRenameProject" // - 点击 Project Item 弹出菜单的「重命名」按钮
-    case ot_draft_clickCopyProject = "speedApp_clickCopyProject" // - 点击 Project Item 弹出菜单的「复制」按钮
-    case ot_draft_clickDeleteProject = "speedApp_clickDeleteProject" // - 点击 Project Item 弹出菜单的「删除」按钮
-    case ot_draft_uploadMaterial = "speedApp_uploadMaterial" // - 素材开始上传事件
-    case ot_draft_uploadMatrialSuccess = "speedApp_uploadMatrialSuccess" // - 素材上传成功事件
-    case ot_draft_downloadMaterial = "speedApp_downloadMaterial" // - 素材开始下载事件
-    case ot_draft_downloadMaterialSuccess = "speedApp_downloadMaterialSuccess" // - 素材下载成功事件
-    case ot_videoCompose_mux_complete = "speedApp_videoCompose_mux_complete" // 创作工具「合成成功」添加上报参数
-
-    case ot_reproduce_collectionClicButton = "speedApp_clickReproduceButton_collection" // - 再创作集合页的「再创作按钮」
-    case ot_reproduce_clickButton = "speedApp_clickReProduceButton" // 再创作按钮(右上角)点击上报
-    case ot_reproduce_collectionBar = "speedApp_clickReproduceCollectionBar" // 再创作按钮(左下角)点击上报
-    case ot_reproduce_collectionVideo = "speedApp_clickReproduceCollectionVideo" // 再创作集合页的「视频」点击上报
-    case ot_reproduce_sameSourceButton = "speedApp_viewSameSourceButton" // 再创作查看同款来源按钮
-    case ot_reproduce_saveProjectToDraftBox = "speedApp-saveProjectToDraftBox" // 创作工具「保存项目成功」添加上报参数
+    case ot_draft_clicktButton = "shanyinApp_clickOpenProjectListButton" // 草稿箱点击入口
+    case ot_draft_editProject = "shanyinApp_editProject" // - 点击 Project Item(草稿箱中的每个项目)
+    case ot_draft_viewProject = "shanyinApp_viewProject" // - 看到 Project Item(草稿箱中的每个项目)
+    case ot_draft_clickEditProject = "shanyinApp_clickEditProject" // - 点击 Project Item 弹出菜单的「编辑」按钮
+    case ot_draft_clickPublishProject = "shanyinApp_clickPublishProject" // - 点击 Project Item 弹出菜单的「去发布」按钮
+    case ot_draft_clickRenameProject = "shanyinApp_clickRenameProject" // - 点击 Project Item 弹出菜单的「重命名」按钮
+    case ot_draft_clickCopyProject = "shanyinApp_clickCopyProject" // - 点击 Project Item 弹出菜单的「复制」按钮
+    case ot_draft_clickDeleteProject = "shanyinApp_clickDeleteProject" // - 点击 Project Item 弹出菜单的「删除」按钮
+    case ot_draft_uploadMaterial = "shanyinApp_uploadMaterial" // - 素材开始上传事件
+    case ot_draft_uploadMatrialSuccess = "shanyinApp_uploadMatrialSuccess" // - 素材上传成功事件
+    case ot_draft_downloadMaterial = "shanyinApp_downloadMaterial" // - 素材开始下载事件
+    case ot_draft_downloadMaterialSuccess = "shanyinApp_downloadMaterialSuccess" // - 素材下载成功事件
+    case ot_videoCompose_mux_complete = "shanyinApp_videoCompose_mux_complete" // 创作工具「合成成功」添加上报参数
+
+    case ot_reproduce_collectionClicButton = "shanyinApp_clickReproduceButton_collection" // - 再创作集合页的「再创作按钮」
+    case ot_reproduce_clickButton = "shanyinApp_clickReProduceButton" // 再创作按钮(右上角)点击上报
+    case ot_reproduce_collectionBar = "shanyinApp_clickReproduceCollectionBar" // 再创作按钮(左下角)点击上报
+    case ot_reproduce_collectionVideo = "shanyinApp_clickReproduceCollectionVideo" // 再创作集合页的「视频」点击上报
+    case ot_reproduce_sameSourceButton = "shanyinApp_viewSameSourceButton" // 再创作查看同款来源按钮
+    case ot_reproduce_saveProjectToDraftBox = "shanyinApp-saveProjectToDraftBox" // 创作工具「保存项目成功」添加上报参数
     // add by ak
     case speedApp_viewWindow_upload2Compose // 「上传转创作」:窗口曝光
     case speedApp_clickButton_upload2Compose_addMusic // 「上传转创作」:加音乐 - 按钮点击
@@ -225,31 +233,43 @@ public  enum  objectType: String {
     case speedApp_clickButton_addMusicTip // 「创作工具页」:添加音乐提示 - 按钮点击
 
     /*************** 卡点视频相关objectType ***************/
-    case ot_click_syncedUpMusic = "speedApp_clickButton_syncedUpMusic" // 弹出面板中点击「卡点视频」按键
-    case ot_view_selectSyncedUpMaterial = "speedApp_viewWindow_selectSyncedUpMaterial" // 曝光上报:卡点视频素材选择页
-    case ot_click_confirmMaterial = "speedApp_clickButton_confirmSyncedUpMaterial" // 点击上报:卡点视频素材确认按钮
-    case ot_click_back = "speedApp_clickButton_back" // 点击上报:返回按钮
-    case ot_view_selectSyncedUpMusic = "speedApp_viewWindow_selectSyncedUpMusic" // 曝光上报:卡点视频音乐选择页
-    case ot_view_syncedUpMusic = "speedApp_viewButton_syncedUpMusic" // 曝光上报:音乐素材曝光
-    case ot_click_auditionMusic = "speedApp_clickButton_auditionMusic" // 点击上报:音乐素材试听
-    case ot_click_chooseMusic = "speedApp_clickButton_chooseMusic" // 点击上报:选择音乐素材
-    case ot_click_chooseMusicCategory = "speedApp_clickButton_chooseMusicCategory" // 点击上报:选择音乐分类
-    case ot_click_chooseMusicCategoryTag = "speedApp_clickButton_chooseMusicCategoryTag" // 点击上报:选择音乐分类下的 TAG
-    case ot_view_previewSyncedUp = "speedApp_viewWindow_previewSyncedUp" // 曝光上报:预览页面曝光上报
-    case ot_click_selectMusic = "speedApp_clickButton_selectMusic" // 点击上报:重新选择音乐
-    case ot_click_selectRhythm = "speedApp_clickButton_selectRhythm" // 点击上报:选择节奏
-    case ot_click_dragFront = "speedApp_clickButton_dragFront" // 点击上报:拖动拖拽条(左部分)
-    case ot_click_dragBehind = "speedApp_clickButton_dragBehind" // 点击上报:拖动拖拽条(右部分)
+    case ot_view_selectSyncedUpMaterial = "shanyinApp_viewWindow_selectSyncedUpMaterial" // 曝光上报:卡点视频素材选择页
+    case ot_click_confirmMaterial = "shanyinApp_clickButton_confirmSyncedUpMaterial" // 点击上报:卡点视频素材确认按钮
+    case ot_click_back = "shanyinApp_clickButton_back" // 点击上报:返回按钮
+    case ot_view_selectSyncedUpMusic = "shanyinApp_viewWindow_selectSyncedUpMusic" // 曝光上报:卡点视频音乐选择页
+    case ot_view_syncedUpMusic = "shanyinApp_viewButton_syncedUpMusic" // 曝光上报:音乐素材曝光
+    case ot_click_auditionMusic = "shanyinApp_clickButton_auditionMusic" // 点击上报:音乐素材试听
+    case ot_click_chooseMusic = "shanyinApp_clickButton_chooseMusic" // 点击上报:选择音乐素材
+    case ot_click_chooseMusicCategory = "shanyinApp_clickButton_chooseMusicCategory" // 点击上报:选择音乐分类
+    case ot_click_chooseMusicCategoryTag = "shanyinApp_clickButton_chooseMusicCategoryTag" // 点击上报:选择音乐分类下的 TAG
+    case ot_view_previewSyncedUp = "shanyinApp_viewWindow_previewSyncedUp" // 曝光上报:预览页面曝光上报
+    case ot_click_selectMusic = "shanyinApp_clickButton_selectMusic" // 点击上报:重新选择音乐
+    case ot_click_selectRhythm = "shanyinApp_clickButton_selectRhythm" // 点击上报:选择节奏
+    case ot_click_dragFront = "shanyinApp_clickButton_dragFront" // 点击上报:拖动拖拽条(左部分)
+    case ot_click_dragBehind = "shanyinApp_clickButton_dragBehind" // 点击上报:拖动拖拽条(右部分)
     case ot_click_commit = "sppedApp_clickButton_commit" // 点击上报:去合成
-    case ot_view_searchSyncedUpMusic = "speedApp_viewWindow_searchSyncedUpMusic" // 曝光上报:音乐素材搜索页
-    case ot_click_searchSyncedUpMusic = "speedApp_clickButton_searchSyncedUpMusic" // 点击上报:用户在搜索框输入文字然后按回车
-    case ot_view_searchMusic = "speedApp_viewButton_searchMusic" // 曝光上报:搜索结果音乐素材曝光
-    case ot_click_auditionSearchMusic = "speedApp_clickButton_auditionSearchMusic" // 点击上报:试听音乐素材
-    case ot_click_chooseSearchMusic = "speedApp_clickButton_chooseSearchMusic" // 点击上报:选择音乐素材
-    case ot_view_publishSyncedUp = "speedApp_viewWindow_publishSyncedUp" // 曝光上报:窗口曝光
-    case ot_click_shareWechat = "speedApp_clickButton_shareWechat" // 点击上报:分享微信
-    case ot_click_shareWechatMoment = "speedApp_clickButton_shareWechatMoment" // 点击上报:分享朋友圈
-    case ot_click_finished = "speedApp_clickButton_finished" // 点击上报:完成
+    case ot_view_searchSyncedUpMusic = "shanyinApp_viewWindow_searchSyncedUpMusic" // 曝光上报:音乐素材搜索页
+    case ot_click_searchSyncedUpMusic = "shanyinApp_clickButton_searchSyncedUpMusic" // 点击上报:用户在搜索框输入文字然后按回车
+    case ot_view_searchMusic = "shanyinApp_viewButton_searchMusic" // 曝光上报:搜索结果音乐素材曝光
+    case ot_click_auditionSearchMusic = "shanyinApp_clickButton_auditionSearchMusic" // 点击上报:试听音乐素材
+    case ot_click_chooseSearchMusic = "shanyinApp_clickButton_chooseSearchMusic" // 点击上报:选择音乐素材
+    case ot_view_publishSyncedUp = "shanyinApp_viewWindow_publishSyncedUp" // 曝光上报:窗口曝光
+    case ot_click_shareWechat = "shanyinApp_clickButton_shareWechat" // 点击上报:分享微信
+    case ot_click_shareWechatMoment = "shanyinApp_clickButton_shareWechatMoment" // 点击上报:分享朋友圈
+    case ot_click_finished = "shanyinApp_clickButton_finished" // 点击上报:完成
+    
+    
+    //闪音点击上报:首页点击底部+
+    case ot_shanyinApp_clickButton_syncedUpMusic = "shanyinApp_clickButton_syncedUpMusic"
+
+    //视频播放点击
+    case ot_shanyinApp_clickButton_syncedUpMusicRecreate = "shanyinApp_clickButton_syncedUpMusicRecreate"
+    case ot_shanyinApp_viewButton_syncedUpMusicRecreate = "shanyinApp_viewButton_syncedUpMusicRecreate"
+    //点击上报:首页点击底部“我的”页面入口
+    case ot_shanyinApp_clickButton_mineTab = "shanyinApp_clickButton_mineTab"
+    //页面曝光上报:“我的”页面曝光
+    case ot_shanyinApp_viewPage_mineTab = "shanyinApp_viewPage_mineTab"
+
 }
 
 // MARK: - 视频上报类型

+ 1 - 1
BFFramework/Classes/PQGPUImage/akfilters/PQGPUImageFilterGroup.swift

@@ -33,7 +33,7 @@ open class PQGPUImageFilterGroup: PQBaseFilter{
         
         var showFitler:PQBaseFilter?
         if currentSticker!.type == StickerType.VIDEO.rawValue {
-            showFitler = PQMoveFilter(movieSticker: currentSticker!)
+            showFitler = PQMovieFilter(movieSticker: currentSticker!)
  
 
         } else if currentSticker!.type == StickerType.IMAGE.rawValue {

+ 99 - 107
BFFramework/Classes/PQGPUImage/akfilters/PQMoveFilter.swift → BFFramework/Classes/PQGPUImage/akfilters/PQMovieFilter.swift

@@ -1,5 +1,5 @@
 //
-//  PQMoveFilter.swift
+//  PQMovieFilter.swift
 //  GPUImage_iOS
 //
 //  Created by ak on 2020/8/27.
@@ -38,13 +38,22 @@
  output中可以设置supportsRandomAccess,当为true时,可以重置读取范围,但需要调用方调用copyNextSampleBuffer,直到该方法返回NULL。
  或者重新初始化一个AVAssetReader来设置读取时间。
  如果尝试第一种方案,需要使用seek,可以尝试每次设置一个不太长的区间,以保证读取完整个区间不会耗时太多,且时间间隔最好以关键帧划分。
+ 
+ fps
+ 
+ 25.0 fps :   0.0000  0.0400  0.0800  0.1200  0.1600  0.2000  0.2400  0.2800  0.3200  0.3600  0.4000  0.4400  0.4800  0.5200  0.5600  0.6000  0.6400  0.6800  0.7200  0.7600  0.8000  0.8400  0.8800  0.9200  0.9600  1.0000  1.0400  1.0800  1.1200  1.1600  1.2000
+ 30.0 fps :   0.0000  0.0333  0.0667  0.1000  0.1333  0.1667  0.2000  0.2333  0.2667  0.3000  0.3333  0.3667  0.4000  0.4333  0.4667  0.5000  0.5333  0.5667  0.6000  0.6333  0.6667  0.7000  0.7333  0.7667  0.8000  0.8333  0.8667  0.9000  0.9333  0.9667  1.0000
+ 60.0 fps :   0.0000  0.0167  0.0333  0.0500  0.0667  0.0833  0.1000  0.1167  0.1333  0.1500  0.1667  0.1833  0.2000  0.2167  0.2333  0.2500  0.2667  0.2833  0.3000  0.3167  0.3333  0.3500  0.3667  0.3833  0.4000  0.4167  0.4333  0.4500  0.4667  0.4833  0.5000
+ 80.0 fps :   0.0000  0.0125  0.0250  0.0375  0.0500  0.0625  0.0750  0.0875  0.1000  0.1125  0.1250  0.1375  0.1500  0.1625  0.1750  0.1875  0.2000  0.2125  0.2250  0.2375  0.2500  0.2625  0.2750  0.2875  0.3000  0.3125  0.3250  0.3375  0.3500  0.3625  0.3750
+120.0 fps :   0.0000  0.0083  0.0167  0.0250  0.0333  0.0417  0.0500  0.0583  0.0667  0.0750  0.0833  0.0917  0.1000  0.1083  0.1167  0.1250  0.1333  0.1417  0.1500  0.1583  0.1667  0.1750  0.1833  0.1917  0.2000  0.2083  0.2167  0.2250  0.2333  0.2417  0.2500
+
 
  */
 
 import Foundation
 import UIKit
 
-class PQMoveFilter: PQBaseFilter {
+class PQMovieFilter: PQBaseFilter {
     public var runBenchmark = false
 
     public weak var delegate: MovieInputDelegate?
@@ -52,7 +61,8 @@ class PQMoveFilter: PQBaseFilter {
     var yuvConversionShader: ShaderProgram?
     var asset: AVAsset?
     var videoComposition: AVVideoComposition?
-    var playAtActualSpeed: Bool = false
+    // 使用原始速度
+    var playAtActualSpeed: Bool = true
 
     // Time in the video where it should start.
     var requestedStartTime: CMTime?
@@ -82,19 +92,36 @@ class PQMoveFilter: PQBaseFilter {
 
     // 最后一帧图像数据 CMSampleBuffer 不会 deep copy 所以使用一个CVImageBuffer变量
     var lastImageBuffer: CVImageBuffer?
-
+    //
+    var currentRenderImageBuffer: CVPixelBuffer?
+    var currentRenderImageBufferTimeStamp: CMTime = .zero
+    var currentRenderSampleBuffer: CMSampleBuffer?
     // 旋转角度值
     var mImageOrientation: ImageOrientation = .portrait
 
     var inputSize: GLSize = GLSize(width: 0, height: 0)
 
+    var timebaseInfo = mach_timebase_info_data_t()
+
     // 缓存帧属性
     var cacheFrameBufferMaxCount: Int = 16
     // 缓存数量
     @Atomic var cacheframeBuffers: Array = Array<CMSampleBuffer>.init()
 
+    var currentThread: Thread?
     /// Use serial queue to ensure that the picture is smooth
     var seekQueue: DispatchQueue!
+
+    // * 设置播放速率 范围 0 - 8(理论值) rate 正常速度为1.0;小于为慢速;大于为快速。但不能高于解码速度1-2ms硬解一帧
+    var speedRate: Float = 1.0
+
+    // 原视频素材的 FPS
+    var stickerFPS: Float = 0
+        
+    //开始时间,创建 filter 显示的时候有
+    var startTimeStamp: CMTime?
+    
+    
     deinit {}
 
     public init(url: URL) {
@@ -134,7 +161,7 @@ class PQMoveFilter: PQBaseFilter {
         FilterLog(message: " move FILTER 初始化 开始显示时间:\(movieSticker.timelineIn) 结束显示时间:\(movieSticker.timelineOut)  裁剪开始时间:\(movieSticker.model_in)  裁剪结束时间:\(movieSticker.out)  路径:\(String(describing: movieSticker.locationPath)) 时长 \(CMTimeGetSeconds(asset?.duration ?? .zero))")
 
         startReading()
- 
+
         if #available(iOS 10.0, *) {
             seekQueue = DispatchQueue(label: "PQ.moveFiler.seeking", qos: .default, attributes: .initiallyInactive, autoreleaseFrequency: .never, target: nil)
         } else {
@@ -143,31 +170,20 @@ class PQMoveFilter: PQBaseFilter {
         if #available(iOS 10.0, *) {
             seekQueue.activate()
         }
- 
     }
 
     public override func newFramebufferAvailable(_ framebuffer: Framebuffer, fromSourceIndex: UInt) {
         super.newFramebufferAvailable(framebuffer, fromSourceIndex: fromSourceIndex)
 
-        let currTime = CMTimeGetSeconds(CMTime(value: framebuffer.timingStyle.timestamp!.value, timescale: framebuffer.timingStyle.timestamp!.timescale))
-
-        FilterLog(message: "1111111111 \(currTime)")
- 
+//        let currTime = CMTimeGetSeconds(CMTime(value: framebuffer.timingStyle.timestamp!.value, timescale: framebuffer.timingStyle.timestamp!.timescale))
     }
- 
 
     open override func renderFrame() {
-
-
         let inputFramebuffer: Framebuffer = inputFramebuffers[0]!
         inputSize = inputFramebuffer.sizeForTargetOrientation(.portrait)
-
-//        let currTime = CMTimeGetSeconds(CMTime(value: inputFramebuffer.timingStyle.timestamp!.value, timescale: inputFramebuffer.timingStyle.timestamp!.timescale))
-
-//        enableSeek = inputFramebuffer.userInfo?["enableSeek"] as? Bool ?? false
-        BFLog(message: "enableSeek is \(enableSeek)")
+  
         currentTime = CMTime(value: inputFramebuffer.timingStyle.timestamp!.value, timescale: inputFramebuffer.timingStyle.timestamp!.timescale)
-        FilterLog(message: "11定帧!duration is currentSampleTime is \(CMTimeGetSeconds(currentTime))")
+        FilterLog(message: "duration is currentSampleTime is \(CMTimeGetSeconds(currentTime))")
 
         renderFramebuffer = sharedImageProcessingContext.framebufferCache.requestFramebufferWithProperties(orientation: mImageOrientation, size: inputSize, stencil: false)
 
@@ -180,23 +196,38 @@ class PQMoveFilter: PQBaseFilter {
         releaseIncomingFramebuffers()
 
         if CMTimeGetSeconds(currentTime) >= moveSticker!.timelineIn, CMTimeGetSeconds(currentTime) <= moveSticker!.timelineOut {
-            FilterLog(message: "开始显示 movefilter 了 开始\(String(describing: moveSticker?.timelineIn)) 结束 :\(String(describing: moveSticker?.timelineOut)) currentTime \(CMTimeGetSeconds(currentTime)) 裁剪开始时间:\(moveSticker?.model_in) ")
-            // 取出视频每一帧并渲染
+            FilterLog(message: "开始显示 movefilter 了 开始\(String(describing: moveSticker?.timelineIn)) 结束 :\(String(describing: moveSticker?.timelineOut)) currentTime \(CMTimeGetSeconds(currentTime)) 裁剪开始时间:\(String(describing: moveSticker?.model_in)) ")
+
             if enableSeek {
+                FilterLog(message: "seek 到 \(CMTimeGetSeconds(currentTime))  ")
                 resetRangeTime(startTime: currentTime)
                 enableSeek = false
             }
-            readNextVideoFrame()
 
             if !isStartReading {
                 isStartReading = false
                 startReading()
             }
+            
+            if(startTimeStamp == nil){
+                startTimeStamp = currentTime
+            }
+                        
+            let stickerTime = CMTime(value: Int64((moveSticker?.model_in ?? 0) * 600), timescale: 600)
+          
+            let PTSTime = CMTimeAdd(stickerTime, CMTimeSubtract(currentTime, startTimeStamp ?? .zero))
+            
+            let showBuffer  = getNextSampleBuffer(showTimeStamp: CMTime.init(value: CMTimeValue(Int(Float(PTSTime.value) * speedRate)), timescale: PTSTime.timescale))
+            
+            if(showBuffer != nil){
+                process(movieFrame:CMSampleBufferGetImageBuffer(showBuffer!)!, withSampleTime: currentTime)
+            }
+
         } else {
             isStartReading = false
-            FilterLog(message: "开始显示 movefilter 了 结束了\(String(describing: moveSticker?.timelineIn))  currentTime  \(CMTimeGetSeconds(currentTime)) 裁剪开始时间:\(moveSticker?.model_in) ")
+            FilterLog(message: "开始显示 movefilter 了 结束了\(String(describing: moveSticker?.timelineIn))  currentTime  \(CMTimeGetSeconds(currentTime)) 裁剪开始时间:\(String(describing: moveSticker?.model_in)) ")
             FilterLog(message: "不显示 movefilter 了")
-            
+
             assetReader?.cancelReading()
         }
     }
@@ -222,14 +253,14 @@ class PQMoveFilter: PQBaseFilter {
 
     // MARK: -
 
-    public func loadAsset(url: URL, videoComposition: AVVideoComposition?, playAtActualSpeed: Bool = false, loop: Bool = false, audioSettings: [String: Any]? = nil) throws {
+    public func loadAsset(url: URL, videoComposition: AVVideoComposition?, playAtActualSpeed: Bool = true, loop: Bool = false, audioSettings: [String: Any]? = nil) throws {
         asset = AVURLAsset(url: url, options: avAssertOptions)
 
         if asset != nil {
-            let fps = asset!.tracks(withMediaType: .video).first?.nominalFrameRate
-            let cbr = asset!.tracks(withMediaType: .video).first?.estimatedDataRate
-            
-            FilterLog(message: "move filter asset  fps is \(String(describing: fps))  bit rate is \(cbr ?? 0)")
+            stickerFPS = asset!.tracks(withMediaType: .video).first?.nominalFrameRate ?? 0.0
+            let bitRate = asset!.tracks(withMediaType: .video).first?.estimatedDataRate
+
+            FilterLog(message: "move filter asset  fps is \(String(describing: stickerFPS))  bit rate is \(bitRate ?? 0)")
 
             self.videoComposition = videoComposition
             self.playAtActualSpeed = playAtActualSpeed
@@ -266,24 +297,10 @@ class PQMoveFilter: PQBaseFilter {
                 assetReader!.add(readerVideoTrackOutput)
             }
 
-            if let requestedStartTime = self.requestedStartTime {
-//                if enableSeek {
-                    let outTimeSeconds = moveSticker?.out == 0 ? moveSticker!.duration : moveSticker?.out
-//                    assetReader!.timeRange = CMTimeRange(start: requestedStartTime, duration: CMTimeMake(value: Int64((outTimeSeconds ?? 0 - CMTimeGetSeconds(requestedStartTime)) * 600.0), timescale: 600))
-                
-                assetReader!.timeRange = CMTimeRange(start: CMTime.init(value: Int64((moveSticker?.model_in ?? 0) * 600), timescale: 600), duration: CMTimeMake(value: Int64(((moveSticker?.out ?? 0) - (moveSticker?.model_in ?? 0)) * 600.0), timescale: 600))
-                
-                
+            assetReader!.timeRange = CMTimeRange(start: CMTime(value: Int64((moveSticker?.model_in ?? 0) * 600), timescale: 600), duration: CMTimeMake(value: Int64(((moveSticker?.out ?? 0) - (moveSticker?.model_in ?? 0)) * 600.0), timescale: 600))
 
-//                } else {
-//                    assetReader!.timeRange = CMTimeRange(start: requestedStartTime, duration: CMTimeMake(value: Int64(
-//                        // 这里判断有问题?
-//                        (moveSticker!.timelineIn == 0 && moveSticker!.timelineOut == 0) ? moveSticker!.duration : (moveSticker!.out - moveSticker!.model_in) * 600
-//                    ), timescale: 600))
-//                }
+            FilterLog(message: "set   assetReader!.timeRange is \(assetReader!.timeRange)")
 
-                FilterLog(message: "set   assetReader!.timeRange is \(assetReader!.timeRange)")
-            }
             return assetReader
         } catch {
             debugPrint("ERROR: Unable to create asset reader: \(error)")
@@ -293,10 +310,6 @@ class PQMoveFilter: PQBaseFilter {
 
     open func startReading() {
         FilterLog(message: "开始初始化")
-//        if isStartReading {
-//            FilterLog(message: "已经初始化过了")
-//            return
-//        }
 
         assetReader?.cancelReading()
 
@@ -319,6 +332,7 @@ class PQMoveFilter: PQBaseFilter {
             debugPrint("ERROR: Unable to start reading: \(error)")
             return
         }
+ 
     }
 
     // 设置解码开始时间
@@ -327,65 +341,48 @@ class PQMoveFilter: PQBaseFilter {
         requestedStartTime = startTime
         startReading()
     }
-
-    // 取出第一帧数据
-    func readNextVideoFrame() {
+    
+    
+    func getNextSampleBuffer(showTimeStamp:CMTime) -> CMSampleBuffer? {
+        
+        BFLog(message: "查找的帧时间为:\(CMTimeGetSeconds(showTimeStamp))")
+        
         if assetReader == nil {
             FilterLog(message: "assetReader is error 出现严重错误!!!!!!!!!!!!!!")
-            return
+            return nil
         }
-
         var videoTrackOutput: AVAssetReaderOutput?
         for output in assetReader!.outputs {
             if output.mediaType == AVMediaType.video {
                 videoTrackOutput = output
             }
         }
-   
-
-        let beginDecoderTime: TimeInterval = Date().timeIntervalSince1970
-
-        let sampleBuffer = videoTrackOutput!.copyNextSampleBuffer()
-        let endDecoderTime: TimeInterval = Date().timeIntervalSince1970
-        FilterLog(message: "\(beginDecoderTime) \(endDecoderTime)解帧时长  \( TimeInterval(endDecoderTime - beginDecoderTime))")
-        if sampleBuffer == nil && assetReader?.status == .completed {
-            FilterLog(message: "已经播放完成了 \(CMTimeGetSeconds(currentTime))")
-            // 如果不是自动循环模式 且 定帧/裁剪模式 播放完一次后自动停止
-
-            if moveSticker?.materialDurationFit?.fitType != adapterMode.loopAuto.rawValue, moveSticker?.materialDurationFit?.fitType != adapterMode.staticFrame.rawValue {
-                return
-            }
-            // 自动循环模式 重头开始循环
-            if moveSticker?.materialDurationFit?.fitType == adapterMode.loopAuto.rawValue {
-                FilterLog(message: "自动循环模式 重头开始循环 \(CMTimeGetSeconds(currentTime))")
-                isStartReading = false
-                startReading()
-
-            } else if moveSticker?.materialDurationFit?.fitType == adapterMode.staticFrame.rawValue {
-                if lastImageBuffer != nil {
-//                    FilterLog(message: "处理显示定帧")
-//                    let currTime = CMTimeGetSeconds(currentTime!)
-//                    FilterLog(message: "process time is \(currTime)")
-                    process(movieFrame: lastImageBuffer!, withSampleTime: currentTime)
-                }
-
-                return
+ 
+        var targetSampleBuffer: CMSampleBuffer?
+        
+        while assetReader?.status == .reading {
+  
+            let beginDecoderTime: TimeInterval = Date().timeIntervalSince1970
+            targetSampleBuffer = videoTrackOutput!.copyNextSampleBuffer()
+            if(targetSampleBuffer == nil){
+                BFLog(message: " copyNextSampleBuffer is nil error!!!")
+                return nil
             }
+            let targetTimeStamp = CMSampleBufferGetOutputPresentationTimeStamp(targetSampleBuffer!)
+            
+            //目标帧 时间
+            if targetSampleBuffer != nil && CMTimeGetSeconds(targetTimeStamp) > CMTimeGetSeconds(showTimeStamp){
+                FilterLog(message: "查找的帧时间为:\(CMTimeGetSeconds(showTimeStamp))  命中时间为: \(CMTimeGetSeconds(targetTimeStamp))")
+                
+                return targetSampleBuffer
 
-            return
-        } else {
-            FilterLog(message: "copy sampleBuffer is error ??? \(String(describing: assetReader?.status)) \(sampleBuffer)")
-        }
-
-        if sampleBuffer != nil {
-            if enableSeek {
-                BFLog(message: "cacheframeBuffers 添加后 个数\(cacheframeBuffers.count)")
-                cacheframeBuffers.append(sampleBuffer!)
-            } else {
-                // 正常处理每一帧
-                processCurrentBuffer(sampleBuffer: sampleBuffer!)
             }
+            let endDecoderTime: TimeInterval = Date().timeIntervalSince1970
+            FilterLog(message: "\(beginDecoderTime) \(endDecoderTime)解帧时长  \(TimeInterval(endDecoderTime - beginDecoderTime))")
         }
+        
+        return nil
+        
     }
 
     func processCurrentBuffer(sampleBuffer: CMSampleBuffer) {
@@ -393,11 +390,7 @@ class PQMoveFilter: PQBaseFilter {
         let duration = asset!.duration // Only used for the progress block so its acuracy is not critical
 
         sharedImageProcessingContext.runOperationSynchronously {
-            self.process(movieFrame: sampleBuffer)
-
-            //            资源裁剪的 开始时间18.51261146496816  结束时间: 24.29780254777071
-            // message: 资源裁剪的 开始时间23.9121237307506  结束时间: 27.537509554140126👈
-//            FilterLog(message: "素材 \(self.moveSticker?.locationPath) 取出每一帧的时间: \(self.moveSticker!.out == 0 ? duration.seconds : self.moveSticker!.out) currentSampleTime is \(CMTimeGetSeconds(currentSampleTime))")
+//            self.process(movieFrame: sampleBuffer)
 
             FilterLog(message: "seek 时间为: 素材 \(String(describing: self.moveSticker?.locationPath)) 取出每一帧 显示时间: \(CMTimeGetSeconds(self.currentTime)) 帧时间 \(CMTimeGetSeconds(currentSampleTime))")
 
@@ -414,13 +407,7 @@ class PQMoveFilter: PQBaseFilter {
         }
     }
 
-    func process(movieFrame frame: CMSampleBuffer) {
-        let movieFrame = (CMSampleBufferGetImageBuffer(frame) == nil) ? lastImageBuffer : CMSampleBufferGetImageBuffer(frame)!
-        if movieFrame != nil {
-            process(movieFrame: movieFrame!, withSampleTime: currentTime)
-        }
-    }
-
+ 
     func process(movieFrame: CVPixelBuffer, withSampleTime: CMTime) {
         let bufferHeight = CVPixelBufferGetHeight(movieFrame)
         let bufferWidth = CVPixelBufferGetWidth(movieFrame)
@@ -527,4 +514,9 @@ class PQMoveFilter: PQBaseFilter {
         chrominanceFramebuffer.unlock()
         secondChrominanceFramebuffer?.unlock()
     }
+
+    
+    func nanosToAbs(_ nanos: UInt64) -> UInt64 {
+        return nanos * UInt64(timebaseInfo.denom) / UInt64(timebaseInfo.numer)
+    }
 }

+ 1 - 1
BFFramework/Classes/PQGPUImage/akfilters/Tools/PQCompositionExporter.swift

@@ -158,7 +158,7 @@ public class PQCompositionExporter {
         if(input != nil && lastshowSticker != currentSticker){
             var showFitler:PQBaseFilter?
             if currentSticker!.type == StickerType.VIDEO.rawValue {
-                showFitler = PQMoveFilter(movieSticker: currentSticker!)
+                showFitler = PQMovieFilter(movieSticker: currentSticker!)
      
 
             } else if currentSticker!.type == StickerType.IMAGE.rawValue {

+ 38 - 32
BFFramework/Classes/Stuckpoint/Controller/PQStuckPointEditerController.swift

@@ -428,6 +428,10 @@ class PQStuckPointEditerController: PQBaseViewController {
                     BFLog(message: "\(currentTime) \(tatolTime) 显示播放器进度为: \(progress)")
 
                     self?.stuckPointCuttingView.videoCropView.updateProgress(progress: CGFloat(progress))
+                    
+                    if self?.synchroMarskView.superview != nil {
+                        self?.synchroMarskView.removeMarskView()
+                    }
                 }
  
             }
@@ -468,7 +472,7 @@ extension PQStuckPointEditerController {
         // 所有视频总时长
         var videoTotalDuration: Float64 = 0.0
         for video in section.sectionTimeline!.visionTrack!.getEnableVisionTrackMaterials(type: "video") {
-            let asset: AVURLAsset = AVURLAsset(url: URL(fileURLWithPath: documensDirectory + video.locationPath), options: nil)
+            let asset: AVURLAsset = AVURLAsset(url: URL(fileURLWithPath: video.locationPath), options: nil)
             videoTotalDuration = videoTotalDuration + Float64(CMTimeGetSeconds(asset.duration))
         }
         if videoTotalDuration == 0 {
@@ -477,7 +481,7 @@ extension PQStuckPointEditerController {
         }
         for sticker in section.sectionTimeline!.visionTrack!.getEnableVisionTrackMaterials() {
             if sticker.type == StickerType.VIDEO.rawValue {
-                let asset: AVURLAsset = AVURLAsset(url: URL(fileURLWithPath: documensDirectory + sticker.locationPath), options: nil)
+                let asset: AVURLAsset = AVURLAsset(url: URL(fileURLWithPath: sticker.locationPath), options: nil)
                 // 要分割的段落
                 let clipNum = Int(max(round(Double(kongduan) * CMTimeGetSeconds(asset.duration) / videoTotalDuration), 1))
                 sticker.duration = CMTimeGetSeconds(asset.duration)
@@ -738,54 +742,56 @@ extension PQStuckPointEditerController {
             if synchroMarskView.superview == nil {
                 UIApplication.shared.keyWindow?.addSubview(synchroMarskView)
             }
-            let dispatchGroup = DispatchGroup()
+
             for photo in selectedPhotoData! {
                 if photo.asset != nil, photo.asset?.mediaType == .video, photo.locationPath.count <= 0 {
                     if !isHaveVideo {
                         isHaveVideo = true
                     }
-                    dispatchGroup.enter()
-                    PQPHAssetVideoParaseUtil.exportPHAssetToMP4(phAsset: photo.asset!, deliveryMode: .highQualityFormat) { [weak self] phAsset, _, filePath, _ in
-                        let tempPhoto = self?.selectedPhotoData?.first(where: { material in
-                            material.asset == phAsset
-                        })
-                        if tempPhoto != nil {
-                            if filePath != nil, (filePath?.count ?? 0) > 0 {
-                                tempPhoto?.locationPath = filePath?.replacingOccurrences(of: documensDirectory, with: "") ?? ""
-                                BFLog(message: "导出视频相册地址为")
+ 
+                    PQPHAssetVideoParaseUtil.parasToAVAsset(phAsset: photo.asset!) { avAsset, fileSize, _, _ in
+                        if avAsset is AVURLAsset {
+                            // 创建目录
+
+                            let fileName = (avAsset as! AVURLAsset).url.absoluteString
+                            BFLog(message: "video  fileName is\(fileName)")
+                            let tempPhoto = self.selectedPhotoData?.first(where: { material in
+                                material.asset == photo.asset
+                            })
+                            
+                            if(fileName.count ) > 0 {
+                                tempPhoto?.locationPath = fileName.replacingOccurrences(of: "file:///", with: "")
+                                BFLog(message: "导出视频相册地址为 \(fileName)")
                             }
-                            dispatchGroup.leave()
+ 
+                            DispatchQueue.main.async {
+                                self.isExportVideosSuccess = true
+                                BFLog(message: "所有相册视频导出成功")
+                              
+                                    self.dealWithDataSuccess()
+                                
+                            }
+                            
                         }
                     }
+  
                 }
             }
-            dispatchGroup.notify(queue: DispatchQueue.main) { [weak self] in
-                self?.isExportVideosSuccess = true
-                BFLog(message: "所有相册视频导出成功")
-                // 处理所有数据完成
-                if isHaveVideo {
-                    self?.dealWithDataSuccess()
-                }
-            }
-        }
-        if !isHaveVideo {
-            isExportVideosSuccess = true
-            // 处理所有数据完成
-            dealWithDataSuccess()
+            
         }
+ 
     }
 
     /// 处理所有数据完成
     /// - Returns: <#description#>
     func dealWithDataSuccess() {
-        if !isSynchroMusicInfoSuccess || !isExportVideosSuccess || !isStuckPointDataSuccess {
-            return
-        }
+//        if !isSynchroMusicInfoSuccess  || !isStuckPointDataSuccess {
+//            return
+//        }
         playeTimeRange = CMTimeRange(start: CMTime(value: CMTimeValue(Int64((stuckPointMusicData?.startTime ?? 0) * 600)), timescale: 600), end: CMTime(value: CMTimeValue(Int64((stuckPointMusicData?.endTime ?? 0) * 600)), timescale: 600))
         createPorjectData()
         settingPlayerView()
-        if synchroMarskView.superview != nil {
-            synchroMarskView.removeMarskView()
-        }
+    
     }
 }
+

+ 1 - 1
BFFramework/Classes/Stuckpoint/ViewModel/PQGPUImagePlayerView.swift

@@ -441,7 +441,7 @@ public class PQGPUImagePlayerView: UIView, RenderViewDelegate {
 
             var showFitler: PQBaseFilter?
             if currentSticker!.type == StickerType.VIDEO.rawValue {
-                showFitler = PQMoveFilter(movieSticker: currentSticker!)
+                showFitler = PQMovieFilter(movieSticker: currentSticker!)
 
             } else if currentSticker!.type == StickerType.IMAGE.rawValue {
                 showFitler = PQImageFilter(sticker: currentSticker!)

+ 1 - 1
BFFramework/Classes/Stuckpoint/ViewModel/PQPlayerViewModel.swift

@@ -65,7 +65,7 @@ open class PQPlayerViewModel: NSObject {
                             filters.append(imageFilter)
 
                         } else if sticker.type == StickerType.VIDEO.rawValue {
-                            let videoFilter = PQMoveFilter(movieSticker: sticker)
+                            let videoFilter = PQMovieFilter(movieSticker: sticker)
 
                             filters.append(videoFilter)