Browse Source

filter 添加层级参数

jsonwang 3 years ago
parent
commit
316ba9393e

+ 3 - 0
BFFramework/Classes/PQGPUImage/akfilters/PQBaseFilter.swift

@@ -33,6 +33,9 @@ open class PQBaseFilter: BasicOperation {
     public var isShow:Bool = false
        //创建filter所使用的贴纸信息
     public var stickerInfo:PQEditVisionTrackMaterialsModel?
+    
+    //显示层级
+    public var zOrder:Int = 0
 
     //析构数据
     public func clearData()  {

+ 4 - 2
BFFramework/Classes/PQGPUImage/akfilters/PQSubTitleFilter.swift

@@ -15,7 +15,7 @@ import BFCommonKit
 // add by ak  if have alpha used discard
 public let AlphaPassthroughFragmentShader = "varying highp vec2 textureCoordinate;\n \n uniform sampler2D inputImageTexture;\n \n void main()\n {\n     lowp vec4 color = texture2D(inputImageTexture, textureCoordinate);\n     if (color.a < 1.0) \n     {\n         discard;\n     } \n     else\n     {\n         gl_FragColor = color;\n     }\n }\n "
 
-open class PQSubTitleFilter: BasicOperation {
+open class PQSubTitleFilter: PQBaseFilter {
     // ui label
     var subtitleLab: PQSubTitleLabel = PQSubTitleLabel()
 
@@ -48,6 +48,8 @@ open class PQSubTitleFilter: BasicOperation {
         mSubtitles = st
 
         subTitleTexture = 0
+    
+        zOrder = 1000
 
         for subtitle in mSubtitles! {
             BFLog(message: "初始化数据 start: \(subtitle.timelineIn)  end: \(subtitle.timelineOut) 显示的文字:\(subtitle.text)")
@@ -116,7 +118,7 @@ open class PQSubTitleFilter: BasicOperation {
     }
 
     // 清空数据
-    func clearData() {
+    override public func clearData() {
         BFLog(message: "清空字幕数据!")
         subtitleImage = nil
         glDeleteTextures(1, &subTitleTexture)

+ 35 - 31
BFFramework/Classes/PQGPUImage/akfilters/Tools/PQCompositionExporter.swift

@@ -19,7 +19,7 @@ public class PQCompositionExporter {
     public let asset: AVAsset
     public let videoComposition: AVVideoComposition?
     public let audioMix: AVAudioMix?
-    public let filters: [ImageProcessingOperation]?
+    public var filters: [PQBaseFilter]?
     public var mStickers:[PQEditVisionTrackMaterialsModel]?
     public let animationTool: AVVideoCompositionCoreAnimationTool?
     public let exportURL: URL
@@ -51,7 +51,7 @@ public class PQCompositionExporter {
     //是否合成片尾模式
     var isEndMovie:Bool = false
 
-    public init(asset: AVAsset, videoComposition: AVVideoComposition? = nil, audioMix: AVAudioMix? = nil, filters: [ImageProcessingOperation]? = nil,stickers:[PQEditVisionTrackMaterialsModel]? = nil, animationTool: AVVideoCompositionCoreAnimationTool? = nil, exportURL: URL) {
+    public init(asset: AVAsset, videoComposition: AVVideoComposition? = nil, audioMix: AVAudioMix? = nil, filters: [PQBaseFilter]? = nil,stickers:[PQEditVisionTrackMaterialsModel]? = nil, animationTool: AVVideoCompositionCoreAnimationTool? = nil, exportURL: URL) {
         self.asset = asset
         self.videoComposition = videoComposition
         self.audioMix = audioMix
@@ -123,16 +123,30 @@ public class PQCompositionExporter {
         }
         BFLog(message: "export mShowVidoSize is \(String(describing: input?.mShowVidoSize))")
     
-        let videoEncodingSettings: [String: Any] = [
-            AVVideoCompressionPropertiesKey: [
-                AVVideoExpectedSourceFrameRateKey: 30,
-                AVVideoAverageBitRateKey: videoAverageBitRate == 0 ? Int(input?.mShowVidoSize.width ?? 0) * Int(input?.mShowVidoSize.height ?? 0) * 2 : videoAverageBitRate,
-                AVVideoProfileLevelKey: AVVideoProfileLevelH264HighAutoLevel,
-                AVVideoH264EntropyModeKey: AVVideoH264EntropyModeCABAC,
-            ],
-            //                AVVideoAllowFrameReorderingKey: videoTrack.requiresFrameReordering],
-            AVVideoCodecKey: AVVideoCodecH264,
-        ] // deprecated: 11.0, renamed: "AVVideoCodecType.h264" 改名
+        var videoEncodingSettings: [String: Any] = ["":""]
+        if #available(iOS 11.0, *) {
+              videoEncodingSettings  = [
+                AVVideoCompressionPropertiesKey: [
+                    AVVideoExpectedSourceFrameRateKey: 30,
+                    AVVideoAverageBitRateKey: (videoAverageBitRate / 2) == 0 ? Int(input?.mShowVidoSize.width ?? 0) * Int(input?.mShowVidoSize.height ?? 0) : videoAverageBitRate,
+
+//                    AVVideoH264EntropyModeKey: AVVideoH264EntropyModeCABAC,
+                ],
+                //                AVVideoAllowFrameReorderingKey: videoTrack.requiresFrameReordering],
+                AVVideoCodecKey: AVVideoCodecHEVC,
+            ]
+        }
+        
+//        let videoEncodingSettings: [String: Any] = [
+//            AVVideoCompressionPropertiesKey: [
+//                AVVideoExpectedSourceFrameRateKey: 30,
+//                AVVideoAverageBitRateKey: videoAverageBitRate == 0 ? Int(input?.mShowVidoSize.width ?? 0) * Int(input?.mShowVidoSize.height ?? 0) * 2 : videoAverageBitRate,
+//                AVVideoProfileLevelKey: AVVideoProfileLevelH264HighAutoLevel,
+//                AVVideoH264EntropyModeKey: AVVideoH264EntropyModeCABAC,
+//            ],
+//            //                AVVideoAllowFrameReorderingKey: videoTrack.requiresFrameReordering],
+//            AVVideoCodecKey: AVVideoCodecH264,
+//        ] // deprecated: 11.0, renamed: "AVVideoCodecType.h264" 改名
 
         do {
             try output = MovieOutput(URL: tmpExportURL ?? exportURL, size: Size(width: Float(input?.mShowVidoSize.width ?? 1080), height: Float(input?.mShowVidoSize.height ?? 1080)), fileType: .mp4, liveVideo: false, videoSettings: videoEncodingSettings, videoNaturalTimeScale: 30, audioSettings: audioEncodingSettings, audioSourceFormatHint: nil)
@@ -147,7 +161,12 @@ public class PQCompositionExporter {
         
         if(mStickers == nil){
             var currentTarget: ImageSource = input!
-
+        
+            //根据zOrder 进行排序
+            filters?.sort(by: { a, b in
+                a.zOrder < b.zOrder
+            })
+            
             if filters?.count ?? 0 > 0 {
                 filters!.forEach {
                     currentTarget.addTarget($0, atTargetIndex: 0)
@@ -166,8 +185,7 @@ public class PQCompositionExporter {
         return true
     }
     
- 
-    public  func  findShowStikcer(currTime:Float64)  {
+    public  func  findShowSticker(currTime:Float64)  {
          
         if(mStickers?.count ?? 0 == 0){
             BFLog(message: "mStickers data is error")
@@ -182,21 +200,7 @@ public class PQCompositionExporter {
                 break
             }
         }
-//        while true {
-//
-//            if let sticker = mStickers!.first {
-//                if Float(sticker.timelineIn).decimalNumber(5) <= Float(currTime).decimalNumber(5) && Float(sticker.timelineOut).decimalNumber(5) >= Float(currTime).decimalNumber(5) {
-//                    BFLog(message: " 导出时换了的时间:\(currTime)")
-//                    currentSticker = sticker
-//                    break
-//                }else{
-//                    mStickers!.removeFirst()
-//                }
-//            }else{
-//                break
-//            }
-//        }
-        
+ 
         //创建不同的filter
         if(currentSticker == nil){
             BFLog(message: "sticker data is error")
@@ -333,7 +337,7 @@ public class PQCompositionExporter {
         input?.progress = { [weak self] currTime, duration, progress in
             
             if(self?.mStickers?.count ?? 0 > 0){
-                self?.findShowStikcer(currTime: CMTimeGetSeconds(self?.input?.currentTime ?? .zero) )
+                self?.findShowSticker(currTime: CMTimeGetSeconds(self?.input?.currentTime ?? .zero) )
 //                self?.changeFilter(currTime: CMTimeGetSeconds(self?.input?.currentTime ?? .zero) )
             }
             DispatchQueue.main.async {[weak self] in

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

@@ -14,11 +14,11 @@ import BFUIKit
 open class PQPlayerViewModel: NSObject {
     /// 根据贴纸信息转成种 fitler ,编辑 ,总览,导出共用
     /// - Parameter parts: filter 组
-    public class func partModelToFilters(sections: [PQEditSectionModel], inputSize: CGSize = .zero) -> ([ImageProcessingOperation], [URL]) {
+    public class func partModelToFilters(sections: [PQEditSectionModel], inputSize: CGSize = .zero) -> ([PQBaseFilter], [URL]) {
         // 所有段的声音位置
         var audioFiles: Array = Array<URL>.init()
         // 所有滤镜数组
-        var filters: Array = Array<ImageProcessingOperation>.init()
+        var filters: Array = Array<PQBaseFilter>.init()
 
         /*
          一, 默认素材时长