录制视频时将动态文本渲染到 CVPixelBufferRef 上

2024-04-05

我正在使用录制视频和音频AVCaptureVideoDataOutput and AVCaptureAudioDataOutput并在captureOutput:didOutputSampleBuffer:fromConnection:委托方法,我想将文本绘制到从视频连接接收到的每个单独的示例缓冲区上。文本几乎每一帧都会发生变化(它是一个秒表标签),我希望将其记录在捕获的视频数据之上。

到目前为止,这是我能想到的:

//1.
CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);

//2.   
UIImage *textImage = [self createTextImage];
CIImage *maskImage = [CIImage imageWithCGImage:textImage.CGImage];

//3.
CVPixelBufferLockBaseAddress(pixelBuffer, 0); 
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
NSDictionary *options = [NSDictionary dictionaryWithObject:(__bridge id)colorSpace forKey:kCIImageColorSpace];
CIImage *inputImage = [CIImage imageWithCVPixelBuffer:pixelBuffer options:options];

//4.
CIFilter *filter = [CIFilter filterWithName:@"CIBlendWithMask"];
[filter setValue:inputImage forKey:@"inputImage"];
[filter setValue:maskImage forKey:@"inputMaskImage"];
CIImage *outputImage = [filter outputImage];
CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);

//5.   
[self.renderContext render:outputImage toCVPixelBuffer:pixelBuffer bounds:[outputImage extent] colorSpace:CGColorSpaceCreateDeviceRGB()];

//6.
[self.pixelBufferAdaptor appendPixelBuffer:pixelBuffer withPresentationTime:timestamp];
  1. 在这里,我抓取了像素缓冲区,非常简单。
  2. 我使用核心图形将文本写入空白 UIImage (这就是createTextImage做。我能够验证此步骤是否有效;我将带有文字的图像保存到我的照片中。
  3. 我从像素缓冲区创建一个 CGImage。
  4. 我做了一个 CIFilterCIBlendWithMask,将输入图像设置为从原始像素缓冲区创建的图像,并将输入掩码设置为CIImage由上面绘制有文字的图像制成。
  5. 最后,我将过滤器输出图像渲染到像素缓冲区。这CIContext是预先创建的[CIContext contextWithOptions:nil];.
  6. 毕竟,我将像素缓冲区附加到我的pixelBufferAdaptor具有适当的时间戳。

录制结束时保存的视频没有明显的变化,即没有将遮罩图像绘制到像素缓冲区上。

有人知道我哪里出错了吗?我已经被困在这个问题上好几天了,任何帮助将不胜感激。

EDIT:

- (UIImage *)createTextImage {
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(self.view.bounds.size.width, self.view.bounds.size.height), NO, 1.0);
    NSMutableAttributedString *timeStamp = [[NSMutableAttributedString alloc]initWithString:self.timeLabel.text attributes:@{NSForegroundColorAttributeName:self.timeLabel.textColor, NSFontAttributeName: self.timeLabel.font}];
    NSMutableAttributedString *countDownString = [[NSMutableAttributedString alloc]initWithString:self.cDownLabel.text attributes:@{NSForegroundColorAttributeName:self.cDownLabel.textColor, NSFontAttributeName:self.cDownLabel.font}];
    [timeStamp drawAtPoint:self.timeLabel.center];
    [countDownString drawAtPoint:self.view.center];
    UIImage *blank = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return blank;
}

Do you want to as below? enter image description here

而不是使用CIBlendWithMask,你应该使用CISourceOverCompositing, 尝试这个:

//4.
CIFilter *filter = [CIFilter filterWithName:@"CISourceOverCompositing"];
[filter setValue:maskImage forKey:kCIInputImageKey];
[filter setValue:inputImage forKey:kCIInputBackgroundImageKey];
CIImage *outputImage = [filter outputImage];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

录制视频时将动态文本渲染到 CVPixelBufferRef 上 的相关文章

  • 使用 Storyboard 时获取 NSManagedObjectContext

    目标是获取当前的 NSManagedObjectContext 以便使用 Core Data 在 iOS 4 3 中 我将 UINavigationController 的委托设置为 AppDelegate 如下所示 在 AppDelega
  • 如何通过辅助功能 API 获取当前所选文本的全局屏幕坐标。

    我需要帮助来了解字典应用程序如何在任何应用程序上按 CMD CTRL D 时显示所选文本的以下弹出对话框 我想实施 我的可可应用程序具有相同的功能 我的应用程序将在后台运行 并显示有关所选文本的一些热键的建议 我已经实现了热键捕获 我只需要
  • 在 iOS 上从 GPS 获取时间

    我正在开发一个跟踪器应用程序 该应用程序需要高精度地了解设备位置 即它使用位置服务并忽略水平精度低于 20 米的位置 CLLocation没有明确声明是否通过 GPS 确定 但是 如果水平精度为 20 米或更好 则可以认为它是来自 GPS
  • 显示键盘时如何在 TextView 下方添加更多填充

    当我在 ScrollView 中有 TextField 并点击它时 键盘会按预期显示 但似乎 TextField 已向上移动到足以显示输入区域 但我希望移动到足够的位置 以便整体可见 否则它看起来像是被剪裁了的 我找不到改变这种行为的方法
  • KeyboardAvoidingView - 隐藏键盘时重置高度

    我正在使用 React NativeKeyboardAvoidingView设置我的高度View当显示键盘时 但是当我关闭应用程序中的键盘时 视图的高度不会变回原来的值
  • FBFriendPickerViewController 未显示所有好友

    我正在使用 FBFriendPickerViewController 在我的 iOS 应用程序中显示要邀请的朋友列表 它仅显示安装了该应用程序的好友列表 为什么是这样 我还在我的应用程序中直接与 Facebook sdk 交互 以使用 Gr
  • UITabBarController 未选择的图标图像色调

    我有一个 UITabBarController 我正在尝试修改 现在 未选择的选项卡图标图像默认为灰色 我知道您无法以编程方式更改这些未选择的图标图像的色调 苹果表示 色调是由 png 文件本身的实际色调控制的 因此 如果您想要白色或绿色图
  • 如何消除禁用的 UIButton 的灰色外观

    我有一个 UIButton 我希望它处于禁用状态时与处于正常状态时看起来完全相同 现在它看起来有点灰色 不要使用enabled属性或setEnabled NO方法 而是使用 myButton setUserInteractionEnable
  • 在ScreenUpdates之后调用drawViewHierarchyInRect时iOS8缩放故障:YES

    我正在将一个项目从 iOS7 转换为 iOS8 该项目使用自定义转换 并且需要在加载完成后捕获模式afterScreenUpdates YES并看到整个屏幕放大一秒钟然后缩小 我还在 iOS 版 Flickr 应用程序的各个部分之间以及在
  • Firestore 读取包含子集合的文档的计费

    我正在制作一个应用程序 它存储用户使用我的应用程序学习了多少分钟 我的 Firestore 数据库以 用户 集合开始 每个用户都有自己的文档 该文档由其在 Auth 中生成的 userID 命名 我的问题是 如果我读取了他们的 userID
  • 使用自动布局约束时如何获取视图的当前宽度和高度?

    我不是在谈论frame属性 因为从中你只能得到xib中视图的大小 我说的是当视图由于其约束而调整大小时 可能在旋转之后 或响应事件 有没有办法获取当前的宽度和高度 我尝试迭代其约束来寻找宽度和高度约束 但这不是很干净 并且在存在内在约束时会
  • NSURLConnection 的 URL 文件大小 - Swift

    我想在下载之前从 url 获取文件大小 这是 obj c 代码 NSURL URL NSURL URLWithString ExampleURL NSMutableURLRequest request NSMutableURLRequest
  • Facebook iOS SDK:登录 Facebook 时无需总是询问应用程序的权限

    我在我的应用程序中使用 Facebook iOS SDK 我有两个类似的问题 有没有办法知道当前是否有用户登录 我现在使用的是在成功登录时存储访问令牌和到期日期 并在应用程序启动时加载它们 我的问题是 如果会话无效 我可以为用户提供登录选项
  • CoreBluetooth:如何为许多特性(30 - 40)设计代码?

    我搜索了一下 发现这是一个可能重复的问题 同一设备的多个 CBPeripheral https stackoverflow com questions 10836703 multiple cbperipherals for same dev
  • 有没有办法检测 iOS 设备进入睡眠模式(屏幕变黑时)时的事件?

    我想检测两个事件 设备被锁定 解锁 设备进入睡眠状态并且屏幕变黑 我在这里实现的第一个目标是 有没有办法检查 iOS 设备是否锁定 解锁 https stackoverflow com questions 14229955 is there
  • iOS Safari 通过单击按钮触发扫描信用卡

    您好 我目前正在创建一个测试应用程序 当用户单击文本字段名称或卡号时 扫描信用卡功能对我有用 我的问题是 我希望当用户单击 button1 时发生同样的情况 这应该打开相机来扫描卡并填充现有的文本字段 即名称 卡号和到期日期 额外的好处是
  • 如何在Mac上使用AVFoundation将图片编码为H264,而不是使用x264

    我正在尝试制作一个 Mac 广播客户端 使用 FFmpeg 但不使用 x264 库编码为 H264 所以基本上 我可以从 AVFoundation 中获取原始帧CMSampleBufferRef or AVPicture 那么有没有一种方法
  • 每次 UIScrollView 释放时都会发生内存泄漏

    在我的应用程序中 我有一个滚动视图和四个表格视图 每次拖动然后释放时 我都会泄漏 48 字节 这确实很重要 正如您所看到的 两组泄漏都有相同的来源 有人见过这样的泄漏吗 Edit 1 当我单击泄漏旁边的箭头时 我会得到泄漏的以下信息 您所看
  • 如何连续关闭 2 个模态视图控制器?

    我有 2 个以模态方式呈现的视图控制器 A presents B which presents C 当我解雇C时 我也想解雇B 但我不知道该怎么做 解雇C self dismissModalViewControllerAnimated YE
  • 将文本拆分为数组,同时保留 Swift 中的标点符号

    我想将文本拆分为一个数组 保持标点符号与其余单词分隔开 因此字符串如下 Hello I am Albert Einstein 应该变成这样的数组 Hello I am Albert Einstein 我尝试过sting components

随机推荐

  • Prolog 追加与剪切运算符

    当我们使用append和cut操作符时会出现什么问题 append2 L L append2 H T L H TL append2 T L TL 我尝试了几种不同的输入 但总是成功 append2 1 2 5 L L 1 2 5 appen
  • XPath 中字符串的连接函数

    我正在尝试使用 XPath 获取完整的地址 我是 XPath 新手 这是我到目前为止所做的 p class adr span class street address 2222 Warnar Ave span span class coun
  • FacebookDisplayName 有何用途?

    我们目前正在更改使用 Facebook SDK 进行登录的应用程序的名称 实际上没有其他任何操作 这意味着对于未更新的用户 Facebook 应用程序的名称将与FacebookDisplayName 在我的测试过程中 我找不到对价值的任何影
  • 将 Access-Control-Allow-Origin 添加到 PHP 标头

    我正在尝试解决 WebGL 应用程序上的 CORS 限制 我有一个可以解析 URL 并返回图像的 Web 服务 由于此 Web 服务未启用 CORS 因此我无法使用返回的图像作为纹理 我本来打算 编写 PHP 脚本来处理图像请求 图像请求将
  • Java 中的树实现

    我得到了以下树 然后我们被告知使用last child previous sibling方法来改变这三个的实现 结果如下 我现在正在研究 Java 实现 以在这棵树上执行不同的功能 我们有一个 Tree 接口和一个 TreeNode 接口
  • 如何在java中查找自1970年以来的秒数

    我正在处理一个实时项目 其中我需要查找自 1970 年 1 月 1 日以来的秒数 我使用以下代码来查找秒数 但给出了错误的结果 代码如下 public long returnSeconds int year int month int da
  • 自定义Zuul异常

    我在 Zuul 中有一个场景 其中 URL 路由的服务也可能已关闭 因此 响应正文会在 JSON 正文响应中抛出 500 HTTP Status 和 ZuulException timestamp 1459973637928 status
  • Node webpack 开发服务器在 vuejs 项目中失败“无法获取/”

    当我通过 webpack 运行节点开发服务器时 我的浏览器上收到一条非常无用的消息 Cannot GET 我正在使用以下内容构建 Vuejs 应用程序 Vue Js 的结构是由这个决定的Vue模板 http vuejs templates
  • 相当于python3中的python2 chr(int)

    python2 print chr 174 python3 print chr 174 我正在寻找 python2 中 chr 的等效项 我相信这是由于 python 3 返回 unicode 字符而不是 ASCII 实际上 在Py3中ch
  • C 如何计算没有浮点精度的百分比(千)

    如何将 2 个 int 值的百分比计算为表示百分比的 int 值 更精确的是千分之一 背景 目的 使用没有 FPU 的处理器 浮点计算所需的时间要长 100 倍 int x 25 int y 75 int resultPercentage
  • Ionic APP 中的 Disqus

    我正在尝试在我的 ionic 应用程序中实现 disqus 评论 我知道我必须将其托管在其设置的域上 我相信我已正确配置该域 欢迎任何帮助 这是我的 app js 中离子应用程序的代码 scope showComments function
  • 为什么我可以使用 bot.get_user 函数获取一些用户,但不能获取其他用户? [不和谐.py]

    我当时正在忙着一天的事情并做学校作业 我去了我的不和谐服务器来检查一天中声誉和排行榜进度如何变化 当我使用该命令时 我收到错误 Nonetype object has no attribute display name 所以我很自然地转到运
  • 从另一个类访问静态成员函数

    我在 C 类中有一个静态 stl 映射 并且有另一个静态成员函数来返回指向映射中对象的常量指针 该映射对于该类中的所有对象都是通用的 唯一的问题是 我需要搜索这个映射并从另一个类 位于不同的 cpp h 文件中 设置它 当我尝试在 vs20
  • 是否有一种无点方法将条件检查转换为输入的 Maybe 类型?

    我只是在 haskell 中完成一些简单的练习 想知道是否有一种无点的方法将 if then else 语句转换为Maybe type Nothing如果条件为假则返回 并且Just如果条件为真则输入 简而言之 给出一些 maybeIf a
  • 将我现有的富文本 UI 与 CKEditor API 结合使用

    我有一个现有的富文本 UI 我想将其与 CKEditor 一起使用 基本上 我希望 CKEditor 能够处理应用样式 格式 过滤和规范化插入内容的复杂部分 我现有的 UI 需要驱动交互并根据选择显示状态 即 选择粗体文本应反映在 UI 中
  • 如何在不使用 Github 的情况下使用 Git 在项目中进行协作?

    我是 Git 和 Github 的初学者 但仍然对它们感到困惑 据说我们在与其他人协作时可以不用Github而使用Git 然而 也有人说 Git 可以在本地计算机上运行 如果我们不使用 Github Git 只能在本地运行 我们如何进行协作
  • 比较字符串的瓶颈

    这是一个后续问题C 中的 Char 与 String Speed https stackoverflow com q 3989111 363829 我声明了以下变量 std vector
  • 在 BroadcastReceiver 扩展类中使用 getContentResolver

    我必须在扩展 BroadcastReceiver 的类中使用 getContentResolver 方法 并且我发现 getContentResolver 只能在扩展 Activity 的类中使用 我尝试在扩展活动的类中执行静态方法 但无法
  • 错误 CS7036 没有给出与“SpecflowBaseTest.SpecflowBaseTest(IWebDriver)”所需的形式参数“driver”相对应的参数

    我正在创建一个新框架 因为 PageFactory 已被弃用 我收到错误 Error CS7036 There is no argument given that corresponds to the required formal par
  • 录制视频时将动态文本渲染到 CVPixelBufferRef 上

    我正在使用录制视频和音频AVCaptureVideoDataOutput and AVCaptureAudioDataOutput并在captureOutput didOutputSampleBuffer fromConnection 委托