我正在使用录制视频和音频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];
- 在这里,我抓取了像素缓冲区,非常简单。
- 我使用核心图形将文本写入空白 UIImage (这就是
createTextImage
做。我能够验证此步骤是否有效;我将带有文字的图像保存到我的照片中。
- 我从像素缓冲区创建一个 CGImage。
- 我做了一个 CIFilter
CIBlendWithMask
,将输入图像设置为从原始像素缓冲区创建的图像,并将输入掩码设置为CIImage
由上面绘制有文字的图像制成。
- 最后,我将过滤器输出图像渲染到像素缓冲区。这
CIContext
是预先创建的[CIContext contextWithOptions:nil];
.
- 毕竟,我将像素缓冲区附加到我的
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?
而不是使用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(使用前将#替换为@)