jsonwang 3 anni fa
parent
commit
d135b53575
1 ha cambiato i file con 122 aggiunte e 0 eliminazioni
  1. 122 0
      BFFramework/Classes/PQGPUImage/akfilters/PQTextFilter.swift

+ 122 - 0
BFFramework/Classes/PQGPUImage/akfilters/PQTextFilter.swift

@@ -0,0 +1,122 @@
+//
+//  PQTextFilter.swift
+//  BFFramework
+//
+//  Created by ak on 2021/10/9.
+//  功能:创建文本fitler
+
+import Foundation
+import UIKit
+
+import OpenGLES
+
+import AVFoundation
+ 
+open class PQTextFilter: PQBaseFilter {
+ 
+ 
+    // 字幕gpu texture
+    var subTitleTexture: GLuint = 0
+
+    var subtitleImage: UIImage?
+    deinit {
+        FilterLog(message: "字幕析构 ")
+        clearData()
+    }
+
+    init(sticker: PQEditVisionTrackMaterialsModel) {
+        super.init(fragmentShader: AlphaPassthroughFragmentShader, numberOfInputs: 1)
+        stickerInfo = sticker
+        subTitleTexture = 0
+ 
+        createTexture()
+    }
+ 
+    // 清空数据
+    public override func clearData() {
+        super.clearData()
+
+        subtitleImage = nil
+        glDeleteTextures(1, &subTitleTexture)
+        subTitleTexture = 0
+
+    }
+  
+    func createTexture() {
+        DispatchQueue.main.async {[weak self] in
+ 
+            autoreleasepool {
+                let subtitleLab =
+                UILabel.init(frame: CGRect(x: 0, y: 0, width: self?.stickerInfo?.materialPosition?.width ?? 0, height: self?.stickerInfo?.materialPosition?.height ?? 0))
+             
+                subtitleLab.numberOfLines = 2
+
+                FilterLog(message: "字幕初始化时大小 \(subtitleLab.frame)")
+
+                subtitleLab.textAlignment = .center
+                subtitleLab.backgroundColor = UIColor(red: 1, green: 1, blue: 1, alpha: 0.5)
+
+                subtitleLab.alpha = 1
+               
+                let attributedText: NSMutableAttributedString = NSMutableAttributedString(string: (self?.stickerInfo?.subtitleInfo?.text ?? ""), attributes: [NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: CGFloat(self?.stickerInfo?.subtitleInfo?.fontSize ?? 0)), NSAttributedString.Key.foregroundColor:UIColor.white,NSAttributedString.Key.kern: 0])
+                subtitleLab.attributedText = attributedText
+ 
+                let size: CGSize = subtitleLab.bounds.size
+                UIGraphicsBeginImageContextWithOptions(size, false, 1)
+                subtitleLab.layer.render(in: UIGraphicsGetCurrentContext()!)
+
+                self?.subtitleImage = UIGraphicsGetImageFromCurrentImageContext() ?? UIImage()
+                UIGraphicsEndImageContext()
+
+            }
+ 
+            if self?.subtitleImage?.cgImage != nil, self?.subTitleTexture == 0 {
+                sharedImageProcessingContext.runOperationSynchronously {
+                    autoreleasepool {
+                        self?.subTitleTexture = PQGPUImageTools.setupTexture(image: (self?.subtitleImage!.cgImage!)!)
+                    }
+                }
+            }
+        }
+    }
+ 
+    override open func renderFrame() {
+        let inputFramebuffer: Framebuffer = inputFramebuffers[0]!
+        let inputSize = inputFramebuffer.sizeForTargetOrientation(.portrait)
+
+        let currTime = CMTimeGetSeconds(CMTime(value: inputFramebuffer.timingStyle.timestamp!.value, timescale: inputFramebuffer.timingStyle.timestamp!.timescale))
+        FilterLog(message: "subtitle 当前时间: \(currTime)")
+
+        // 原有画布
+        renderFramebuffer = sharedImageProcessingContext.framebufferCache.requestFramebufferWithProperties(orientation: .portrait, size: inputSize, stencil: false)
+
+        let textureProperties = InputTextureProperties(textureCoordinates: inputFramebuffer.orientation.rotationNeededForOrientation(.portrait).textureCoordinates(), texture: inputFramebuffer.texture)
+
+        renderFramebuffer.activateFramebufferForRendering()
+        clearFramebufferWithColor(backgroundColor)
+        renderQuadWithShader(shader, uniformSettings: uniformSettings,
+                             vertexBufferObject: sharedImageProcessingContext.standardImageVBO, inputTextures: [textureProperties])
+        releaseIncomingFramebuffers()
+
+        if subTitleTexture != 0 {
+            FilterLog(message: "subTitleTexture 有值可以正常显示")
+            let texturePropertiesimagetwo = InputTextureProperties(textureCoordinates: inputFramebuffer.orientation.rotationNeededForOrientation(.portrait).textureCoordinates(), texture: subTitleTexture)
+ 
+            let verticesPoint = PQGPUImageTools.computeVertices(viewSize: CGSize.init(width: CGFloat(inputSize.width), height: CGFloat(inputSize.height)), _bounds: CGRect.init(x: stickerInfo?.materialPosition?.x ?? 0, y:  stickerInfo?.materialPosition?.y ?? 0, width: stickerInfo?.materialPosition?.width ?? 0, height: stickerInfo?.materialPosition?.height ?? 0))
+            
+            renderQuadWithShader(shader,
+                                 uniformSettings: uniformSettings,
+                                 vertexBufferObject: PQGPUImageTools.NXGenerateVBO(for: verticesPoint),
+                                 inputTextures: [texturePropertiesimagetwo])
+
+            releaseIncomingFramebuffers()
+        }else{
+            FilterLog(message: "subTitleTexture is nil!!!!!")
+        }
+    }
+
+    override public func transmitPreviousImage(to _: ImageConsumer, atIndex _: UInt) {
+        print("this is running")
+    }
+}
+