VPCamera3/SwiftProject/SwiftProject/Project/Util/PlayByTransferConvertor.swift

349 lines
16 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// PlayByTransferConvertor.swift
// SwiftProject
//
// Created by aaa on 2024/3/12.
//
import Foundation
import AVKit
import VideoToolbox
import CoreImage
import ImageIO
class PlayByTransferConvertor {
func convertVideo(asset:AVAsset, assetOutput:AVAssetReaderTrackOutput,type:SpatialType,time: CMTime,scale:CGFloat,ed:Int)->(CIImage?) {
var newpb:CIImage? = nil
// var presentationTime:CMTime? = nil
// print("sta.....>>>>>>>thread")
while let nextSampleBuffer = assetOutput.copyNextSampleBuffer() {
let presentationTime = CMSampleBufferGetPresentationTimeStamp(nextSampleBuffer)
// print("presentationTime: \(presentationTime) \ntime: \(time)")
// if presentationTime! > time {//buffer>time,
// print("buffer>time,...")
// break
// }
if presentationTime == time {
guard let taggedBuffers = nextSampleBuffer.taggedBuffers else { break }
let leftEyeBuffer = taggedBuffers.first(where: {
$0.tags.first(matchingCategory: .stereoView) == .stereoView(.leftEye)
})?.buffer
let rightEyeBuffer = taggedBuffers.first(where: {
$0.tags.first(matchingCategory: .stereoView) == .stereoView(.rightEye)
})?.buffer
if let leftEyeBuffer,
let rightEyeBuffer,
case let .pixelBuffer(leftEyePixelBuffer) = leftEyeBuffer,
case let .pixelBuffer(rightEyePixelBuffer) = rightEyeBuffer {
let lciImage = CIImage(cvPixelBuffer: leftEyePixelBuffer)
let rciImage = CIImage(cvPixelBuffer: rightEyePixelBuffer)
let left = UIImage(ciImage: lciImage )
let right = UIImage(ciImage: rciImage )
var cwidth:CGFloat
var cheight:CGFloat
switch type {
case .hsbs:
cwidth = left.size.width
cheight = left.size.height
newpb = joinImages_sbs(left: left, right: right, imgWidth: cwidth, imgHeight:cheight )
break
case .fsbs:
// cwidth = left.size.width
// cheight = left.size.height
// newpb = joinImages_fsbs(left: left, right: right, imgWidth: cwidth, imgHeight: cheight)
newpb = joinImages(leftImage: lciImage, rightImage: rciImage,scale: scale,ed: ed)
break
case .parallelEyes://
newpb = joinImages(leftImage: lciImage, rightImage: rciImage,scale: scale,ed: ed)
break
case .crossedEyes://
newpb = joinImages(leftImage: rciImage, rightImage: lciImage,scale: scale,ed: ed)
break
case .redBlueSolid://
newpb = joinImages_red_blue(lciImage: lciImage, rciImage: rciImage,scale: scale)
break
default:
break
}
}
CMSampleBufferInvalidate(nextSampleBuffer)
break
}
else{//,break,time,
break
}
}
// print("PlayByTransferConvertor ....")
return (newpb)
}
//
func joinImages_red_blue(lciImage:CIImage,rciImage:CIImage,scale: CGFloat) -> CIImage {
//
let redColorMatrix: [CGFloat] = [
0.0, 0.0, 0.0, 0.0, 0.0, //
0.0, 0.0, 0.0, 0.0, 0.0, // 绿
0.0, 0.0, 1.0, 0.0, 0.0, //
0.0, 0.0, 0.0, 1.0, 0.0 //
]
let blueColorMatrix: [CGFloat] = [
1.0, 0.0, 0.0, 0.0, 0.0, //
0.0, 0.0, 0.0, 0.0, 0.0, // 绿
0.0, 0.0, 0.0, 0.0, 0.0, //
0.0, 0.0, 0.0, 1.0, 0.0 //
]
let redFilter = CIFilter(name: "CIColorMatrix")!
redFilter.setValue(lciImage, forKey: kCIInputImageKey)
redFilter.setValue(CIVector(values: redColorMatrix, count: redColorMatrix.count), forKey: "inputRVector")
let blueFilter = CIFilter(name: "CIColorMatrix")!
blueFilter.setValue(rciImage, forKey: kCIInputImageKey)
blueFilter.setValue(CIVector(values: blueColorMatrix, count: blueColorMatrix.count), forKey: "inputBVector")
var lastImg:CIImage? = nil
//
if let redOutputImage = redFilter.outputImage,
let blueOutputImage = blueFilter.outputImage {
let compositeFilter = CIFilter(name: "CIScreenBlendMode")!
compositeFilter.setValue(redOutputImage, forKey: kCIInputImageKey)
compositeFilter.setValue(blueOutputImage, forKey: kCIInputBackgroundImageKey)
let sharpenedFilter = CIFilter(name: "CISharpenLuminance")!
sharpenedFilter.setValue(compositeFilter.outputImage, forKey: kCIInputImageKey)
sharpenedFilter.setValue(2, forKey: kCIInputSharpnessKey)
lastImg = sharpenedFilter.outputImage!
}
if scale == 1 {
return lastImg!
}
else {
var drawImg = UIImage(ciImage: lastImg!)
let drawImageSize = drawImg.size
let newImgSize = CGSizeMake(drawImageSize.width * scale, drawImageSize.height * scale)
let newRect = CGRect(origin: CGPoint(x: (drawImageSize.width - newImgSize.width) * 0.5, y: (drawImageSize.height - newImgSize.height) * 0.5), size: newImgSize)
UIGraphicsBeginImageContextWithOptions(drawImageSize, false, 1);
drawImg.draw(in: newRect)
let image = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext();
let ci = CIImage(cgImage: image.cgImage!)
return ci
}
}
// SBS
func joinImages_sbs( left:UIImage, right:UIImage,imgWidth:CGFloat,imgHeight:CGFloat) -> CIImage {
let newImageSize = CGSize(width:imgWidth, height: imgHeight);
UIGraphicsBeginImageContextWithOptions(newImageSize, false, 1);
left.draw(in: CGRect(x:0, y:0, width:imgWidth/2, height:imgHeight))
right.draw(in: CGRect(x:imgWidth/2, y:0, width:imgWidth/2, height:imgHeight))
let image = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext();
let ci = CIImage(cgImage: image.cgImage!)
return ci
}
//FSBS
func joinImages_fsbs( left:UIImage, right:UIImage,imgWidth:CGFloat,imgHeight:CGFloat) -> CIImage {
let newImageSize = CGSize(width:imgWidth, height: imgHeight);//
UIGraphicsBeginImageContextWithOptions(newImageSize, false, 1);
left.draw(in: CGRect(x:0, y:imgHeight/4, width:imgWidth/2, height:imgHeight/2))
right.draw(in: CGRect(x:imgWidth/2, y:imgHeight/4, width:imgWidth/2, height:imgHeight/2))
let image = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext();
let ci = CIImage(cgImage: image.cgImage!)
return ci
}
// OU
func joinImages_ou( left:UIImage, right:UIImage,imgWidth:CGFloat,imgHeight:CGFloat) -> CIImage {
let newImageSize = CGSize(width:imgWidth, height: imgHeight);
UIGraphicsBeginImageContextWithOptions(newImageSize, false, 1);
left.draw(in: CGRect(x:0, y:0, width:imgWidth, height:imgHeight/2))
right.draw(in: CGRect(x:0, y:imgHeight/2, width:imgWidth, height:imgHeight/2))
let image = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext();
let ci = CIImage(cgImage: image.cgImage!)
return ci
}
//
func joinImages( leftImage:CIImage, rightImage:CIImage,scale:CGFloat,ed:Int) -> CIImage {
//,0.5
//, 1:2, -30 ~ +30
let edS = 20 //
let left = UIImage(ciImage: leftImage )
let right = UIImage(ciImage: rightImage )
//
let (n_left,n_left_size) = getImgWithScale(image: left, scale: scale)
let (n_right,n_right_size) = getImgWithScale(image: right, scale: scale)
//
let x_offset = CGFloat(abs(ed) * edS) //x
let imageWidth = left.size.width*0.5 - x_offset
print("imageWidth:\(imageWidth) ,left.size.width*0.5:\(left.size.width*0.5) ")
let imageHeight = left.size.height
let (ed_left,last_left_size) = getImgWithED(image: n_left, drawImgWidth: imageWidth,drawSize: n_left_size)
let (ed_right,last_right_size) = getImgWithED(image: n_right, drawImgWidth: imageWidth,drawSize: n_right_size)
print("n_left_size:\(n_left_size)\nlast_left_size\(last_left_size)")
print("n_right_size:\(n_right_size)\nlast_right_size\(last_right_size)")
// testImageUi(image: ed_left)
let newImageSize = left.size
UIGraphicsBeginImageContextWithOptions(newImageSize, false, 1)
if (ed > 0) {//,x0;,x
ed_left.draw(in: CGRect(x:0, y:(imageHeight - last_left_size.height) * 0.5, width:last_left_size.width, height:last_left_size.height))
ed_right.draw(in: CGRect(x:newImageSize.width - last_right_size.width, y:(imageHeight - last_right_size.height) * 0.5, width:last_right_size.width, height:last_right_size.height))
print("ed>>>>> 0....")
}
else if (ed < 0) {
ed_left.draw(in: CGRect(x:newImageSize.width*0.5 - last_left_size.width, y:(imageHeight - n_left_size.height) * 0.5, width:last_left_size.width, height:last_left_size.height))
ed_right.draw(in: CGRect(x:newImageSize.width*0.5, y:(imageHeight - n_right_size.height) * 0.5, width:last_right_size.width, height:last_right_size.height))
print("ed < 0....")
}
else {//
let leftRect = CGRect(x:(imageWidth - n_left_size.width) * 0.5, y:(imageHeight - n_left_size.height) * 0.5 , width:n_left_size.width, height:n_left_size.height)
ed_left.draw(in:leftRect )
let rightRect = CGRect(x:imageWidth + (imageWidth - n_right_size.width) * 0.5 , y:(imageHeight - n_right_size.height) * 0.5, width:n_right_size.width, height:n_right_size.height)
ed_right.draw(in:rightRect )
print("newImageSize:\(newImageSize) \nimageWidth:\(imageWidth) \ned_left.size:\(ed_left.size) \nleftRect:\(leftRect) \nrightRect:\(rightRect)")
}
let image = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext();
let ci = CIImage(cgImage: image.cgImage!)
return ci
}
// scale,1
func getImgWithScale(image:UIImage,scale:CGFloat) -> (UIImage,CGSize) {
//rect
let originSize = CGSize(width: image.size.width*0.5, height: image.size.height*0.5)
var newImage = image
var newSize = originSize//
if scale > 1 {//,size,scale
//size,
//height
let Hs_add = (image.size.height - image.size.height*0.5)*(scale - 1)
//heightsize
newSize = CGSizeMake(originSize.width, originSize.height + Hs_add)
//scalesize
let cutSize = CGSizeMake((2 - scale)*(image.size.height * newSize.width/newSize.height),(2 - scale) * image.size.height)
let cutRect = CGRectMake((image.size.width - cutSize.width)*0.5, (image.size.height - cutSize.height) * 0.5, cutSize.width, cutSize.height)
newImage = image.imageAtRect(rect: cutRect)!
}
else if scale < 1 {//,size
//size
newSize = CGSizeMake(scale*originSize.width, scale*originSize.height)
// newImage = image.imageAtRect(rect: CGRect(origin: .zero, size: image.size))!
}
// testImageUi(image: newImage)
return (newImage,newSize)
}
//,:imagedrawSize,imagesizedrawSizesize,
func getImgWithED(image:UIImage,drawImgWidth:CGFloat,drawSize:CGSize) -> (UIImage,CGSize) {
if drawSize.width <= drawImgWidth {
print("瞳距返回,不用处理")
return (image,drawSize)
}
print("瞳距要处理")
// let s = drawSize.height / image.size.height
let newImageWidth = drawImgWidth * image.size.height / drawSize.height
let dRect = CGRectMake((image.size.width - newImageWidth) * 0.5, 0, newImageWidth, image.size.height)
let newImage = image.imageAtRect(rect: dRect)
return (newImage!,CGSize(width: drawImgWidth, height: drawSize.height))
}
func testImageUi(image:UIImage) {
DispatchQueue.main.async {
// var imageView = KWindow?.viewWithTag(9988) as? UIImageView
// if let iv = imageView {
// iv.image = image
// }
// else {
// imageView = UIImageView(frame: CGRect(x: 20, y: 100, width: KScreenWidth*0.5, height: 260))
// imageView?.tag = 9988
// imageView?.backgroundColor = .red
// imageView?.contentMode = .scaleAspectFit
// imageView?.clipsToBounds = true
// imageView?.image = image
// KWindow?.addSubview(imageView!)
// }
var line = KWindow?.viewWithTag(9981 ) as? UIView
guard line == nil else {
return
}
line = UIView()
KWindow?.addSubview(line!)
line?.backgroundColor = .red
line!.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.width.equalTo(2)
make.top.bottom.equalToSuperview()
}
}
}
func joinImages_backup( leftImage:CIImage, rightImage:CIImage) -> CIImage {
let left = UIImage(ciImage: leftImage )
let right = UIImage(ciImage: rightImage )
let imageWidth = left.size.width/2 + right.size.width/2
let imageHeight = left.size.height/2
let newImageSize = CGSize(width:imageWidth, height: left.size.height);
UIGraphicsBeginImageContextWithOptions(newImageSize, false, 1);
left.draw(in: CGRect(x:0, y:imageHeight/2, width:imageWidth/2, height:imageHeight))
right.draw(in: CGRect(x:imageWidth/2, y:imageHeight/2, width:imageWidth/2, height:imageHeight))
let image = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext();
let ci = CIImage(cgImage: image.cgImage!)
return ci
}
}