swift - CI 人脸检测器停止使用 AVAssetWriter 录制音频
问题描述
我想使用苹果 CI 人脸检测器在实时视频中检测人脸,然后我想使用 AVAssetWriter 将视频录制到文件中。
我以为我可以正常工作,但音频是喜怒无常的。有时它会与视频一起正确录制,有时它会开始录制但然后静音,有时它与视频不同步,有时它根本无法工作。
通过打印语句,我可以看到音频样本缓冲区在那里。它必须与面部检测有关,因为当我注释掉记录工作正常的代码时。
这是我的代码:
// MARK: AVCaptureVideoDataOutputSampleBufferDelegate, AVCaptureAudioOutputSampleBufferDelegate
func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
let writable = canWrite()
if writable {
print("Writable")
}
if writable,
sessionAtSourceTime == nil {
// Start Writing
sessionAtSourceTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer)
videoWriter.startSession(atSourceTime: sessionAtSourceTime!)
print("session started")
}
// processing on the images, not audio
if output == videoDataOutput {
connection.videoOrientation = .portrait
if connection.isVideoMirroringSupported {
connection.isVideoMirrored = true
}
// convert current frame to CIImage
let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)
let attachments = CMCopyDictionaryOfAttachments(kCFAllocatorDefault, pixelBuffer!, CMAttachmentMode(kCMAttachmentMode_ShouldPropagate)) as? [String: Any]
let ciImage = CIImage(cvImageBuffer: pixelBuffer!, options: attachments)
// Detects faces based on your ciimage
let features = faceDetector?.features(in: ciImage, options: [CIDetectorSmile : true,
CIDetectorEyeBlink : true,
]).compactMap({ $0 as? CIFaceFeature })
// Retreive frame of your buffer
let desc = CMSampleBufferGetFormatDescription(sampleBuffer)
let bufferFrame = CMVideoFormatDescriptionGetCleanAperture(desc!, false)
// Draw face masks
DispatchQueue.main.async { [weak self] in
UIView.animate(withDuration: 0.2) {
self?.drawFaceMasksFor(features: features!, bufferFrame: bufferFrame)
}
}
}
if writable,
output == videoDataOutput,
(videoWriterInput.isReadyForMoreMediaData) {
// write video buffer
videoWriterInput.append(sampleBuffer)
print("video buffering")
} else if writable,
output == audioDataOutput,
(audioWriterInput.isReadyForMoreMediaData) {
// write audio buffer
audioWriterInput?.append(sampleBuffer)
print("audio buffering")
}
}
解决方案
推荐阅读
- java - 无法从 jms activemq 队列中删除消息
- sql - 使用 select 语句和别名左连接多个表
- javascript - 无法使用 document.querySelectorAll('video') 选择视频元素;
- azure - 应用最新的运行时更新来改进 QnA Maker 结果 - 需要重新迁移?
- python - 在小部件 WxPython 之间添加空间
- angular - 条形图未显示在 angular2+
- pymongo - Pymongo:insert_many() 为字典列表提供“TypeError:文档必须是字典的实例”
- python - 使用用户定义的函数在 Python 中对列表进行排序
- elasticsearch - 是否可以通过散列文档的其他字段来计算 _id 字段?
- r - R:将字符转换为具有未知列类的data.frame中的数字