소스 검색

图片素材性能优化,(音画不同步问题)

jsonwang 3 년 전
부모
커밋
529acdc4ce
2개의 변경된 파일66개의 추가작업 그리고 54개의 파일을 삭제
  1. 59 49
      BFFramework/Classes/PQGPUImage/akfilters/PQImageFilter.swift
  2. 7 5
      BFFramework/Classes/Stuckpoint/ViewModel/PQGPUImagePlayerView.swift

+ 59 - 49
BFFramework/Classes/PQGPUImage/akfilters/PQImageFilter.swift

@@ -12,27 +12,22 @@ import KingfisherWebP
 import UIKit
 
 open class PQImageFilter: PQBaseFilter {
-    var widthOfImage: Int32!
-    var heightOfImage: Int32!
-
     // 图片纹理
     var imageTexture: GLuint = 0
 
     var mSticker: PQEditVisionTrackMaterialsModel?
-
     var newImage: UIImage?
-
     deinit {
         BFLog(message: "image filter deinit 析构掉~")
         newImage = nil
-        
-        if(imageTexture != 0){
-            glDeleteTextures(1,&imageTexture)
+
+        if imageTexture != 0 {
+            glDeleteTextures(1, &imageTexture)
             imageTexture = 0
         }
     }
 
-    init(sticker: PQEditVisionTrackMaterialsModel) {
+    init(sticker: PQEditVisionTrackMaterialsModel, isExport: Bool = false, showUISize: CGSize = .zero) {
         super.init(fragmentShader: PassthroughFragmentShader, numberOfInputs: 1)
 
         mSticker = sticker
@@ -46,18 +41,34 @@ open class PQImageFilter: PQBaseFilter {
 
         newImage = UIImage(contentsOfFile: documensDirectory + sticker.locationPath)
 
+        // 如果是预览时 对原图进行缩放处理
+        if !isExport {
+            var maxLength = max(showUISize.width, showUISize.height)
+
+            maxLength = maxLength + 10
+            newImage = newImage?.nx_scaleWithMaxLength(maxLength: CGFloat(maxLength * UIScreen.main.scale))
+
+            BFLog(message: "newImage is \(newImage?.size.width ?? 0) \(newImage?.size.height ?? 0)")
+
+            if newImage!.size.width > 1000 || newImage!.size.height > 1000 {
+                BFLog(message: "sssssssss")
+            }
+        }
+
         // 保证是16的公倍数
-        //        let aptImageSize =  NXAVUtil.aptSize(newImage!.size)
-        //        if (!__CGSizeEqualToSize(aptImageSize, newImage!.size))
-        //        {
-        //
-        //            FilterLog(message: "原图大小宽度不是16的倍数 \(newImage!.size)")
-        //
-        //            newImage = newImage?.nx_scaleToSize(size: aptImageSize)
-        //
-        //            FilterLog(message: "归16后大小 \(newImage!.size)")
-        //
-        //        }
+//                let aptImageSize =  NXAVUtil.aptSize(newImage!.size)
+//                if (!__CGSizeEqualToSize(aptImageSize, newImage!.size))
+//                {
+//
+//                    FilterLog(message: "原图大小宽度不是16的倍数 \(newImage!.size)")
+//
+//                    newImage = newImage?.nx_scaleToSize(size: aptImageSize)
+//
+//                    FilterLog(message: "归16后大小 \(newImage!.size)")
+//
+//                }
+
+//
         autoreleasepool {
             if newImage == nil {
                 let filePath = documensDirectory + (mSticker?.locationPath ?? "")
@@ -73,7 +84,7 @@ open class PQImageFilter: PQBaseFilter {
 
         if newImage?.cgImage != nil {
             BFLog(message: "提前加载图片。。。。timelineIn : \(String(describing: mSticker?.timelineIn)) timelineOut :\(String(describing: mSticker?.timelineOut)) \(String(describing: mSticker?.locationPath))")
-            
+
 //            imageTexture = PQGPUImageTools.setupTexture(image: newImage!.cgImage!)
 
         } else { FilterLog(message: "image filter init error image data is nil!") }
@@ -82,16 +93,16 @@ open class PQImageFilter: PQBaseFilter {
 //    override public 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))
-////        
-////        if mSticker!.timelineIn != 0, currTime >= mSticker!.timelineIn, currTime <= mSticker!.timelineOut, imageTexture == 0 {
-////            if newImage != nil {
-//////                imageTexture = PQGPUImageTools.setupTexture(image: newImage!.cgImage!)
-////            } else { BFLog(message: "image filter init error image data is nil!") }
-////        }
+    ////        let currTime = CMTimeGetSeconds(CMTime(value: framebuffer.timingStyle.timestamp!.value, timescale: framebuffer.timingStyle.timestamp!.timescale))
+    ////
+    ////        if mSticker!.timelineIn != 0, currTime >= mSticker!.timelineIn, currTime <= mSticker!.timelineOut, imageTexture == 0 {
+    ////            if newImage != nil {
+    //////                imageTexture = PQGPUImageTools.setupTexture(image: newImage!.cgImage!)
+    ////            } else { BFLog(message: "image filter init error image data is nil!") }
+    ////        }
 //    }
 
-    override open func renderFrame() {
+    open override func renderFrame() {
         let inputFramebuffer: Framebuffer = inputFramebuffers[0]!
         let inputSize = inputFramebuffer.sizeForTargetOrientation(.portrait)
 
@@ -118,27 +129,26 @@ open class PQImageFilter: PQBaseFilter {
         FilterLog(message: " image filter 当前时间: \(currTime) \(newImage!.size)")
 
 //        if currTime >= mSticker!.timelineIn && currTime <= mSticker!.timelineOut {
-            FilterLog(message: " 显示图片当前时间: \(currTime) 开始时间:\(mSticker!.timelineIn) 结束时间:\(mSticker!.timelineOut)  \(String(describing: newImage?.size))")
-            // 取纹理坐标
-            let textureCoordinates = PQGPUImageTools.getTextureCoordinates(sticker: mSticker!, textureSize: newImage!.size, cannvasSize: inputSize)
-
-            FilterLog(message: "textureCoordinates is \(textureCoordinates)")
-            
-            //imageTexture 有可能被析构导致黑屏
-            if(imageTexture == 0 && newImage?.cgImage != nil){
-                FilterLog(message: "imageTexture is error !!!!!重新创建")
-                imageTexture = PQGPUImageTools.setupTexture(image: newImage!.cgImage!)
-            }
-        
-            let texturePropertiesimagetwo = InputTextureProperties(textureCoordinates: textureCoordinates, texture: imageTexture)
+        FilterLog(message: " 显示图片当前时间: \(currTime) 开始时间:\(mSticker!.timelineIn) 结束时间:\(mSticker!.timelineOut)  \(String(describing: newImage?.size))")
+        // 取纹理坐标
+        let textureCoordinates = PQGPUImageTools.getTextureCoordinates(sticker: mSticker!, textureSize: newImage!.size, cannvasSize: inputSize)
+
+        FilterLog(message: "textureCoordinates is \(textureCoordinates)")
 
-            let verticesPoint: [GLfloat] = PQGPUImageTools.getVerticesPoint(sticker: mSticker!, textureSize: newImage!.size, cannvasSize: inputSize)
-            renderQuadWithShader(shader,
-                                 uniformSettings: uniformSettings,
-                                 vertexBufferObject: PQGPUImageTools.NXGenerateVBO(for: verticesPoint),
+        // imageTexture 有可能被析构导致黑屏
+        if imageTexture == 0 && newImage?.cgImage != nil {
+            FilterLog(message: "imageTexture is error !!!!!重新创建")
+            imageTexture = PQGPUImageTools.setupTexture(image: newImage!.cgImage!)
+        }
 
-                                 inputTextures: [texturePropertiesimagetwo])
-            releaseIncomingFramebuffers()
- 
+        let texturePropertiesimagetwo = InputTextureProperties(textureCoordinates: textureCoordinates, texture: imageTexture)
+
+        let verticesPoint: [GLfloat] = PQGPUImageTools.getVerticesPoint(sticker: mSticker!, textureSize: newImage!.size, cannvasSize: inputSize)
+        renderQuadWithShader(shader,
+                             uniformSettings: uniformSettings,
+                             vertexBufferObject: PQGPUImageTools.NXGenerateVBO(for: verticesPoint),
+                             
+                             inputTextures: [texturePropertiesimagetwo])
+        releaseIncomingFramebuffers()
     }
 }

+ 7 - 5
BFFramework/Classes/Stuckpoint/ViewModel/PQGPUImagePlayerView.swift

@@ -35,7 +35,7 @@ public class PQGPUImagePlayerView: UIView {
         }
     }
 
-    public var mCanverSize: Size = Size(width: 0, height: 0)
+    public var mCanverSize: CGSize = .zero
 
     // 自动隐藏边框
     public var isAutoHiden: Bool = false
@@ -297,6 +297,8 @@ public class PQGPUImagePlayerView: UIView {
         }
 
         self.frame = frame
+        
+        mCanverSize = frame.size
 
         if isShowLine {
             showBorderLayer()
@@ -480,7 +482,8 @@ public class PQGPUImagePlayerView: UIView {
                     showFitler = PQMovieFilter(movieSticker: currentSticker)
 
                 } else if currentSticker.type == StickerType.IMAGE.rawValue {
-                    showFitler = PQImageFilter(sticker: currentSticker)
+                    showFitler = PQImageFilter(sticker: currentSticker, isExport: (movie?.mIsExport) ?? false, showUISize: mCanverSize)
+                  
                 }
                 if showFitler != nil {
                     BFLog(message: " 加入到缓存 的 filter timelinein:\(currentSticker.timelineIn) timelineout: \(currentSticker.timelineOut) in :\(currentSticker.model_in) out: \(currentSticker.out) index : \(index)")
@@ -521,7 +524,7 @@ public class PQGPUImagePlayerView: UIView {
                           showFitler = PQMovieFilter(movieSticker: currentSticker!)
 
                       } else if currentSticker!.type == StickerType.IMAGE.rawValue {
-                          showFitler = PQImageFilter(sticker: currentSticker!)
+                        showFitler = PQImageFilter(sticker: currentSticker!, isExport: (movie?.mIsExport) ?? false, showUISize: mCanverSize)
                       }
                       if showFitler != nil {
 
@@ -591,8 +594,7 @@ public class PQGPUImagePlayerView: UIView {
                         if blurStickerModel == nil {
                             return
                         }
-                        let showGaussianFitler:PQBaseFilter = PQImageFilter(sticker: blurStickerModel!)
-                        
+                        let showGaussianFitler:PQBaseFilter = PQImageFilter(sticker: blurStickerModel!, isExport: (movie?.mIsExport) ?? false, showUISize: mCanverSize)
                         
                         let iosb:GaussianBlur = GaussianBlur.init()
                         iosb.blurRadiusInPixels = 20