swift webrtc 修改 CMSampleBuffer 以应用一些滤镜效果

2024-01-29

我想在localVideo中添加一些滤镜效果,所以我修改了CMSampleBuffer:

  1. 转换为 UIImage
  2. 使用VNFaceDetector检测人脸boundingBox
  3. 将我的滤镜图像添加到相机图像中
  4. 转换回 CMSampleBuffer
func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
        
        guard let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else {
            return
        }
        let ciimage = CIImage(cvPixelBuffer: imageBuffer)
        let image = convert(cmage: ciimage)
        print("image: \(image.size)")
        
        let faceDetectionRequest = VNDetectFaceLandmarksRequest(completionHandler: { (request: VNRequest, error: Error?) in
            DispatchQueue.main.async {[weak self] in
                if let observations = request.results as? [VNFaceObservation], !observations.isEmpty {
                    for observation in observations {
                        let box = observation.boundingBox
                        let boxFrame = CGRect(x: box.origin.x * image.size.width, y: box.origin.y * image.size.height, width: box.width * image.size.width, height: box.height * image.size.height)
                        print("box: \(boxFrame)")
                        let logo = UIImage(named: "dog_nose")!
                        if let newImage = self?.drawImageIn(image, logo, inRect: boxFrame){
                            if let pxBuffer = self?.convertImageToBuffer(from: newImage){
                                var newSampleBuffer: CMSampleBuffer? = nil
                                var timimgInfo: CMSampleTimingInfo = .invalid
                                var videoInfo: CMVideoFormatDescription? = nil
                                CMVideoFormatDescriptionCreateForImageBuffer(allocator: nil, imageBuffer: pxBuffer, formatDescriptionOut: &videoInfo)
                                if videoInfo != nil{
                                    CMSampleBufferCreateForImageBuffer(allocator: kCFAllocatorDefault, imageBuffer: pxBuffer, dataReady: true, makeDataReadyCallback: nil, refcon: nil, formatDescription: videoInfo!, sampleTiming: &timimgInfo, sampleBufferOut: &newSampleBuffer)
                                    if newSampleBuffer != nil{
                                        self?.outputCaptureDelegate?.captureOutput!(output, didOutput: newSampleBuffer!, from: connection)
                                        return
                                    }
                                }

                            }
                        }
                    }
                }
                self?.outputCaptureDelegate?.captureOutput!(output, didOutput: sampleBuffer, from: connection)
            }
        })
        let imageRequestHandler = VNImageRequestHandler(cvPixelBuffer: imageBuffer, orientation: .up, options: [:])
        do {
            try imageRequestHandler.perform([faceDetectionRequest])
        } catch {
            print(error.localizedDescription)
        }
    }
func convert(cmage: CIImage) -> UIImage {
        let context = CIContext(options: nil)
        let cgImage = context.createCGImage(cmage, from: cmage.extent)!
        let image = UIImage(cgImage: cgImage)
        return image
    }
    
    func drawImageIn(_ image: UIImage, _ logo: UIImage, inRect: CGRect) -> UIImage {
        let renderer = UIGraphicsImageRenderer(size: image.size)
        return renderer.image { context in
            image.draw(in: CGRect(origin: CGPoint.zero, size: image.size))
            logo.draw(in: inRect)
        }
    }
    
    func convertImageToBuffer(from image: UIImage) -> CVPixelBuffer? {
        let attrs = [
            String(kCVPixelBufferCGImageCompatibilityKey) : true,
            String(kCVPixelBufferCGBitmapContextCompatibilityKey) : true
        ] as [String : Any]
        var buffer : CVPixelBuffer?
        let status = CVPixelBufferCreate(kCFAllocatorDefault, Int(image.size.width), Int(image.size.height), kCVPixelFormatType_32ARGB, attrs as CFDictionary, &buffer)
        guard (status == kCVReturnSuccess) else {
            return nil
        }
        
        CVPixelBufferLockBaseAddress(buffer!, CVPixelBufferLockFlags(rawValue: 0))
        let pixelData = CVPixelBufferGetBaseAddress(buffer!)
        
        let rgbColorSpace = CGColorSpaceCreateDeviceRGB()
        let context = CGContext(data: pixelData, width: Int(image.size.width), height: Int(image.size.height), bitsPerComponent: 8, bytesPerRow: CVPixelBufferGetBytesPerRow(buffer!), space: rgbColorSpace, bitmapInfo: CGImageAlphaInfo.noneSkipFirst.rawValue)
        
        context?.translateBy(x: 0, y: image.size.height)
        context?.scaleBy(x: 1.0, y: -1.0)
        
        UIGraphicsPushContext(context!)
        image.draw(in: CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height))
        UIGraphicsPopContext()
        CVPixelBufferUnlockBaseAddress(buffer!, CVPixelBufferLockFlags(rawValue: 0))
        
        return buffer
    }

但问题是视频速度更慢并且图像方向错误,有人遇到过这个吗?


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

swift webrtc 修改 CMSampleBuffer 以应用一些滤镜效果 的相关文章

  • 如何在 tvOS 中添加检测按钮按下情况?

    我已经遵循这个tutorial http jamesonquave com blog developing tvos apps for apple tv with swift 一切正常 我遇到的唯一问题是我不知道如何检测何时按下按钮 提前致
  • Swift:如何审查/过滤输入的脏话等文本?

    我只是想看看是否有一种既定的方法可以做到这一点 或者如何去做 我有一个文本字段 它本质上充当我的 iOs 应用程序中的表单 用户可以在其中发布内容 我不能让用户发布脏话 不恰当的废话 所以我想过滤掉他们输入的字符串包含这些单词之一的内容并显
  • Swift 3.0 中使用索引访问字符串的 Big O

    访问的复杂度是多少String与index in swift 3 0 复杂度与数组访问或 O N 或其他相同吗 来自文档 https developer apple com library prerelease content docume
  • 在选择器视图中为行实现的标题没有改变字体?

    我尝试更改选择器视图中标题的字体 但由于某种原因我不能 我可以更改标题的颜色 但字体保持不变 func pickerView pickerView UIPickerView attributedTitleForRow row Int for
  • 无法发出桥接标头的预编译标头

    我从 GitHub 下载了一个项目 然后 pod 了以下文件 其中一些文件是由 OBJ C 编写的 我使用了桥接头 pod SnapKit pod MJRefresh pod Alamofire pod Kingfisher pod MBP
  • Swift 中的自定义输入视图

    我花了几个小时试图弄清楚如何创建 然后定制inputView上班 我有一个网格TextInputs 想想拼字板 按下时应该加载自定义inputView插入文本 我创建了一个 xib文件包含UI elements为定制inputView 我能
  • AVPlayerLooper 每次迭代后黑闪

    我正在使用 Apple 的示例代码在UICollectionViewCell背景 我在用着AVPlayerLooper 因为它是同一视频的迭代 我的问题是 当视频结束时 它会显示轻微的黑屏闪烁 也许它正在将视频搜索到0时间 我不确定 这是代
  • 协议本身不符合?

    为什么这段 Swift 代码无法编译 protocol P struct S P let arr P S extension Array where Element P func test
  • 如何覆盖应用程序中的内部框架方法(框架外部)

    在 Swift 中子类化时是否有重写内部框架方法 前任 超类 public class BarChartRenderer ChartDataRendererBase internal func drawDataSet context con
  • 动态高度 UITableViewCell 内的动态高度 UICollectionView

    我有一个水平的UICollectionView固定到 a 的所有边缘UITableViewCell 集合视图中的项目是动态调整大小的 我想让表视图的高度等于最高集合视图单元格的高度 视图的结构如下 UI表格视图 UITableViewCel
  • 如何检查 TURN 服务器日志?

    我已经安装了开源 TURN 服务器 rfc5766 turn server 我使用以下命令运行它sudo turnserver L my domain in a b usr local etc turnuserdb conf f r dom
  • 如何将 4 个字节转换为 Swift 浮点数?

    我正在用 Swift 编写一个 MsgPack 解析器作为学习该语言的一种方式 感觉不太适合这项任务 但我一直在进步 现在我遇到了一个块 我似乎无法说服它将 4 个字节转换为浮点数 var bytes Array
  • 数组的扩展,其中元素是可选的

    我有一个数组String like so var myArray String 2 banana nil 31 我还有另一个数组String像这样 var myStringArray String 2 3 我为 Array 编写了一个扩展
  • 无法在 Swift 中创建文件路径

    我尝试在 Swift 中打开该文件 为此 我创建了文件路径 这不起作用 maaaacy pwd Users tsypa maaaacy cat a txt test maaaacy a swift nil maaaacy 剧本 usr bi
  • Swift - 在 TableView 单元格中使用步进器递增标签

    这里又是一个 Swift 初学者 我只是想在每个 TableView 单元格中使用一个步进器来增加同一单元格中的标签 我发现了关于这个主题的几个问题 但它们包含其他元素 我无法提取基本概念 Swift Stepper Action 更改同一
  • 如何读取 Xcode 6.1 Instruments .trace 文件?

    我一直在尝试阅读 trace文件 我使用生成的custom仪器模板 仪器 自动机 分配 Leaks using 仪器 https developer apple com library mac documentation Developer
  • CIAdditionCompositing 给出不正确的效果

    我正在尝试通过平均其他几个图像来创建图像 为了实现这一点 我首先将每个图像变暗 其系数等于我平均的图像数量 func darkenImage by multiplier CGFloat gt CIImage let divImage CII
  • UIApplication.shared.delegate 相当于 SceneDelegate xcode11?

    我在 SceneDelegate 中定义了一个 let 属性 我希望一些 ViewController 能够在场景中访问它 在 UIKit 中 我可以像这样访问 App Delegate 属性 UIApplication shared de
  • 弱变量中间为零

    弱变量什么时候变为零 weak var backgroundNode SKSpriteNode texture SKTexture image initialBackgroundImage backgroundNode position C
  • Swift 中的 quitFirstResponder

    我怎样才能用Apple的新语言实现它 Objective C 代码 void touchesBegan NSSet touches withEvent UIEvent event for UIView view in self view s

随机推荐

  • 命名约定(单数或复数名称类)

    我有一个class对商店进行建模 所以它具有以下属性 name 描述 address phone etc 我应该命名它吗ShopInfo or 商店信息 任何链接到命名约定 如果你有一个类的对象 它只是信息for one店铺 该对象描述了一
  • iOS Swift:从 CNContactProperty 中获取用户选择的电话号码作为字符串[重复]

    这个问题在这里已经有答案了 正如标题所示 在我使用 swift 的 iOS 应用程序中 我有一个 CNContactProperty 对象 我想从中提取电话号码作为字符串 用户从中选择联系人后 CNContact 属性通过委托协议函数从标准
  • 我该如何清理这个 lambda?

    我有一个在多个 LINQ 查询中多次使用的表达式 因此我将其分离到它自己的返回该表达式的方法中 该函数的 lambda 部分看起来有点混乱 有人想尝试重构它并使其更具可读性和 或更小吗 private Expression
  • 使用不同的替换顺序替换字符串中与单个模式匹配的多个位置

    Using stringr包中 很容易以矢量化方式执行正则表达式替换 问题 我该如何执行以下操作 替换中的每个单词 hello world your make world hello pos 不同的替代品 例如数量不断增加 1 2 3 4
  • Eclipse RCP 4 与 NetBeans Platform 8 对比:选择什么?

    我即将为我的公司启动一个相当大的应用程序 由于它必须是跨平台的 我们指向 Java 本来会喜欢 C 但探索了 Xamarin 生态系统 而 Mac 部分似乎远远落后于休息包 现在 我正在将 Netbeans 8 和 Eclipse 4 作为
  • 如何通过蓝牙 android 发送/接收字符串到另一部 android 手机

    在我的 Android 应用程序中 我想通过蓝牙将字符串从一台设备发送到另一台设备 可用设备显示在列表视图中 我想在不配对的情况下发送字符串 我无法在设备之间建立连接 任何人都可以帮助我建立连接并发送字符串 我有很多示例 但无法弄清楚文件传
  • 如何在 emacs 艺术家模式下在矩形内写入文本?

    我正在 emacs 中学习艺术家模式 发现它非常有趣 我想创建形状并在其中写入文本 就像我们可以使用其他可以绘制形状的软件一样 但是 当我在矩形内键入一些字符时 形状会变形 垂直线会移动一些字符 Please see attached im
  • zend smtp 邮件在 100 多封邮件后崩溃

    在发送新闻通讯类的邮件时 我遇到了这个奇怪的问题 在 for 循环中 我循环访问数据库中的所有用户 并尝试向他们发送一封包含一些基本信息的 HTML 邮件 现在的问题是 前 200 封左右的邮件运行良好 但随后脚本崩溃并给出以下错误 War
  • 使用 NSDate() 快速创建未来日期

    我收到错误 调用中缺少参数 编码器 的参数 以下代码 var components NSDateComponents components setValue 1 forComponent NSCalendarUnit CalendarUni
  • Pygame 事件队列

    我想知道是否有一种使用方法poll or get 而不从队列中删除事件 在我的游戏中 我检查不同位置的输入 不仅在主循环中 有时我需要在不同位置检查相同的事件 但是当我检查它时 它会将其从队列中删除 我尝试使用peek 但问题是我无法获得与
  • Zend ACL 动态断言

    我想限制我的用户只能编辑 删除他们添加的评论 我在 youtube 上找到了一个名为 intergral30 的人的示例 并按照他的指示进行操作 现在我的管理员帐户可以编辑 删除所有内容 但我的用户无权访问他自己的评论 这是代码 资源 cl
  • .h 文件有什么意义?

    我知道 h 文件应该有 类声明 函数原型 和外部变量 对于全局变量 但让它成为一个有什么意义吗 h文件 我尝试重命名我的 h文件到一个 c文件 它仍然有效 We can name our file to be anything but we
  • 为什么我不需要引用“System.dll”来使用“System”命名空间?

    我正在处理指定 不要使用任何外部库 的作业 所以我创建了一个 C 应用程序 我做的第一件事就是默认删除所有 dll 的引用 包括 System dll 但是 我仍然可以将其添加到我的代码中 using System using System
  • PostgreSQL全文搜索和保留字,保留一些单词

    我正在使用 Postgresql 和英语字典进行完整的测试搜索 当我想接收带有一些英语单词的记录时 我得到了真实的结果 And so SELECT id FROM table1 WHERE ts vector1 to tsquery it
  • BlockingCollection(Of T) 的目的是什么

    我试图在 NET 4 上新的并行堆栈的上下文中理解 BlockingCollection 的用途 The MSDN http msdn microsoft com en us library dd267312 VS 100 aspx文档说
  • 迭代器(不是迭代器)上的 Lambda 迭代

    我经常读到在迭代器上调用 Lambda 函数是不可能的 直到现在我也一直抱着这样的信念 然而 阅读 Franco Ponticelli 和 Lee McColl Sylvester 所著的 Professional Haxe 一书 了解如何
  • 如何使用 CoreData 执行计算查询

    我有 T SQL 背景 所以 CoreData 的东西对我来说有点新鲜 我正在制作一个应用程序原型 该应用程序最终将使用 MS SQL 后端 Web 服务进行查询 在我的后端 我的 t sql 查询将是这样的 SELECT SQRT SQU
  • “关闭变量会导致性能稍差”。如何?

    在回答 SO 问题时 我被告知我的解决方案将引入变量闭包 因此它的性能会稍差 所以我的问题是 怎么会出现倒闭呢 它将如何影响性能 这里是question https stackoverflow com questions 24696991
  • 有效管理数据变更

    我有一张名为 Bookings 的表 该表包含表示针对特定服务进行的预订的数据 具有许多变量 不久前 我遇到了当前数据结构的问题 即影响时间 日期或价格的预订的任何更改都会影响其他相关的财务记录 日期的预订列表等 我当时的解决方案是创建一个
  • swift webrtc 修改 CMSampleBuffer 以应用一些滤镜效果

    我想在localVideo中添加一些滤镜效果 所以我修改了CMSampleBuffer 转换为 UIImage 使用VNFaceDetector检测人脸boundingBox 将我的滤镜图像添加到相机图像中 转换回 CMSampleBuff