ビデオにオーバーレイを追加するAVAssetWriterでアプリケーションを構築しています。オーバーレイを追加しようとしないときはうまく動作します。しかし、オーバーレイを追加すると、ビデオが半分から切り取られて見えます(スクリーンショットで見ることができます)。ここでオーバーレイを追加すると、キャプチャされたビデオが非常に遅い
は私addOverlayToImage機能である:
func addOverlayToImage(from filteredImage: UIImage) -> UIImage {
UIGraphicsBeginImageContextWithOptions(self.imageView.frame.size, false, 1.0);
self.imageView.layer.render(in: UIGraphicsGetCurrentContext()!)
let imageWithText = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext();
return imageWithText!
}
私はcaptureOutput内部関数を呼び出す:
func captureOutput(_ captureOutput: AVCaptureOutput, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection) {
self.bufferVideoQueue.async() {
let imageWithOverlay = self.addOverlayToImage(from: self.filteredImage)
let buffer = self.imageToBuffer(from: imageWithOverlay)
self.assetWriterPixelBufferInput?.append(buffer!, withPresentationTime: self.currentTime)
}
}
そしてimageToBuffer機能:
func imageToBuffer(from image: UIImage) -> CVPixelBuffer? {
let attrs = [
String(kCVPixelBufferCGImageCompatibilityKey) : kCFBooleanTrue,
String(kCVPixelBufferCGBitmapContextCompatibilityKey) : kCFBooleanTrue
] 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
}
やビデオからのスクリーンショット:
は、あなたが 'addOverlayToImage(...)'を呼び出すコードを表示することができますか?フレームごとに毎回呼び出す場合は、デバイスが各フレームをレンダリングするのに十分な時間が得られていない可能性があります。 – EmilioPelaez
@EmilioPelaezねえ、私は質問を更新しました。プレビューbtwには遅延がありません。出力にのみ表示されます。 – hackio
これを解決しましたか? – Crashalot