采用capturevideodataoutput图片合成ok,注意,此方式合成后的图片无须进行方向旋转

This commit is contained in:
bluesea 2024-05-22 15:00:38 +08:00
parent 0b5b42c2bd
commit 7821f7be4d
6 changed files with 178 additions and 119 deletions

View File

@ -14,8 +14,8 @@
filePath = "SwiftProject/Project/Controller/CCHomeController.swift" filePath = "SwiftProject/Project/Controller/CCHomeController.swift"
startingColumnNumber = "9223372036854775807" startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807"
startingLineNumber = "593" startingLineNumber = "612"
endingLineNumber = "593" endingLineNumber = "612"
landmarkName = "imagePickerController(_:didFinishPickingMediaWithInfo:)" landmarkName = "imagePickerController(_:didFinishPickingMediaWithInfo:)"
landmarkType = "7"> landmarkType = "7">
</BreakpointContent> </BreakpointContent>
@ -30,8 +30,8 @@
filePath = "SwiftProject/Project/Controller/CCHomeController.swift" filePath = "SwiftProject/Project/Controller/CCHomeController.swift"
startingColumnNumber = "9223372036854775807" startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807"
startingLineNumber = "585" startingLineNumber = "604"
endingLineNumber = "585" endingLineNumber = "604"
landmarkName = "imagePickerController(_:didFinishPickingMediaWithInfo:)" landmarkName = "imagePickerController(_:didFinishPickingMediaWithInfo:)"
landmarkType = "7"> landmarkType = "7">
</BreakpointContent> </BreakpointContent>
@ -62,8 +62,8 @@
filePath = "SwiftProject/Project/Controller/CCHomeController.swift" filePath = "SwiftProject/Project/Controller/CCHomeController.swift"
startingColumnNumber = "9223372036854775807" startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807"
startingLineNumber = "549" startingLineNumber = "568"
endingLineNumber = "549" endingLineNumber = "568"
landmarkName = "photoLibrary()" landmarkName = "photoLibrary()"
landmarkType = "7"> landmarkType = "7">
</BreakpointContent> </BreakpointContent>
@ -457,38 +457,6 @@
landmarkType = "7"> landmarkType = "7">
</BreakpointContent> </BreakpointContent>
</BreakpointProxy> </BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
uuid = "2332D3C8-7CB7-4C2D-9D3C-D9A7D05737DE"
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "SwiftProject/Project/View/CCSpatialDisplayTypeView/CCSpatialDisplayTypeView.swift"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "172"
endingLineNumber = "172"
landmarkName = "init(menuWidth:arrow:datas:configures:dissMissCallback:)"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
uuid = "02F226A8-01C1-4FB7-8724-3FB114CBBC79"
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "SwiftProject/Project/View/CCSpatialDisplayTypeView/CCSpatialDisplayTypeView.swift"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "170"
endingLineNumber = "170"
landmarkName = "init(menuWidth:arrow:datas:configures:dissMissCallback:)"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy <BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent <BreakpointContent
@ -547,8 +515,8 @@
filePath = "SwiftProject/Project/Controller/RecordingVideo/CCSpatialShootController/CCSpatialShootController+Generate.swift" filePath = "SwiftProject/Project/Controller/RecordingVideo/CCSpatialShootController/CCSpatialShootController+Generate.swift"
startingColumnNumber = "9223372036854775807" startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807"
startingLineNumber = "186" startingLineNumber = "194"
endingLineNumber = "186" endingLineNumber = "194"
landmarkName = "compositeSpatialPhoto()" landmarkName = "compositeSpatialPhoto()"
landmarkType = "7"> landmarkType = "7">
</BreakpointContent> </BreakpointContent>
@ -556,32 +524,80 @@
<BreakpointProxy <BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent <BreakpointContent
uuid = "F92BC10F-CFF7-4311-8706-052FD06BD96E" uuid = "E6673529-7FC7-4709-A0A8-E857D68BA3D9"
shouldBeEnabled = "Yes" shouldBeEnabled = "Yes"
ignoreCount = "0" ignoreCount = "0"
continueAfterRunningActions = "No" continueAfterRunningActions = "No"
filePath = "SwiftProject/Project/Controller/RecordingVideo/CCSpatialShootController/CCSpatialShootController+Generate.swift" filePath = "SwiftProject/Project/Controller/CCHomeController.swift"
startingColumnNumber = "9223372036854775807" startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807"
startingLineNumber = "252" startingLineNumber = "554"
endingLineNumber = "252" endingLineNumber = "554"
landmarkName = "compositeSpatialPhoto()" landmarkName = "gotoVideoTransformVC(url:asset:)"
landmarkType = "7"> landmarkType = "7">
</BreakpointContent> </BreakpointContent>
</BreakpointProxy> </BreakpointProxy>
<BreakpointProxy <BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent <BreakpointContent
uuid = "C6506EAA-0954-41A9-A944-2AFB157D551F" uuid = "389BFC3B-B70F-492B-AA47-FD20BD63E8A7"
shouldBeEnabled = "Yes" shouldBeEnabled = "Yes"
ignoreCount = "0" ignoreCount = "0"
continueAfterRunningActions = "No" continueAfterRunningActions = "No"
filePath = "SwiftProject/Project/Controller/RecordingVideo/CCSpatialShootController/CCSpatialShootController+Generate.swift" filePath = "SwiftProject/Project/Controller/RecordingVideo/CCSpatialPhotoDisplayController/CCSpatialPhotoDisplayController.swift"
startingColumnNumber = "9223372036854775807" startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807"
startingLineNumber = "259" startingLineNumber = "628"
endingLineNumber = "259" endingLineNumber = "628"
landmarkName = "compositeSpatialPhoto()" landmarkName = "getOrientationAndResolutionSizeForVideo(asset:)"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
uuid = "9CE84387-A6DC-4430-8EDF-1C90B157FB36"
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "SwiftProject/Project/Controller/RecordingVideo/CCSpatialPhotoDisplayController/CCSpatialPhotoDisplayEx.swift"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "137"
endingLineNumber = "137"
landmarkName = "joinImages_red_blue(lciImage:rciImage:scale:rbImage:)"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
uuid = "825FE654-2C40-4F76-B5D2-2EA14A75D54B"
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "SwiftProject/Project/Controller/RecordingVideo/CCSpatialPhotoDisplayController/CCSpatialPhotoDisplayEx.swift"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "93"
endingLineNumber = "93"
landmarkName = "joinImages_red_blue(lciImage:rciImage:scale:rbImage:)"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
uuid = "8E29E821-B4B4-49F7-A00E-E82207F349CA"
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "SwiftProject/Project/Controller/RecordingVideo/CCSpatialPhotoDisplayController/CCSpatialPhotoDisplayEx.swift"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "133"
endingLineNumber = "133"
landmarkName = "joinImages_red_blue(lciImage:rciImage:scale:rbImage:)"
landmarkType = "7"> landmarkType = "7">
</BreakpointContent> </BreakpointContent>
</BreakpointProxy> </BreakpointProxy>

View File

@ -9,105 +9,141 @@
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key> <key>orderHint</key>
<integer>1</integer> <integer>36</integer>
</dict> </dict>
<key>Promises (Playground) 10.xcscheme</key> <key>Promises (Playground) 10.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key> <key>orderHint</key>
<integer>11</integer> <integer>45</integer>
</dict> </dict>
<key>Promises (Playground) 11.xcscheme</key> <key>Promises (Playground) 11.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key> <key>orderHint</key>
<integer>12</integer> <integer>46</integer>
</dict> </dict>
<key>Promises (Playground) 12.xcscheme</key> <key>Promises (Playground) 12.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key> <key>orderHint</key>
<integer>47</integer> <integer>48</integer>
</dict> </dict>
<key>Promises (Playground) 13.xcscheme</key> <key>Promises (Playground) 13.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key> <key>orderHint</key>
<integer>48</integer> <integer>49</integer>
</dict> </dict>
<key>Promises (Playground) 14.xcscheme</key> <key>Promises (Playground) 14.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key> <key>orderHint</key>
<integer>49</integer> <integer>50</integer>
</dict>
<key>Promises (Playground) 15.xcscheme</key>
<dict>
<key>orderHint</key>
<integer>47</integer>
</dict>
<key>Promises (Playground) 16.xcscheme</key>
<dict>
<key>orderHint</key>
<integer>51</integer>
</dict>
<key>Promises (Playground) 17.xcscheme</key>
<dict>
<key>orderHint</key>
<integer>52</integer>
</dict>
<key>Promises (Playground) 18.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>53</integer>
</dict>
<key>Promises (Playground) 19.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>54</integer>
</dict> </dict>
<key>Promises (Playground) 2.xcscheme</key> <key>Promises (Playground) 2.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key> <key>orderHint</key>
<integer>2</integer> <integer>37</integer>
</dict>
<key>Promises (Playground) 20.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>55</integer>
</dict> </dict>
<key>Promises (Playground) 3.xcscheme</key> <key>Promises (Playground) 3.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key> <key>orderHint</key>
<integer>3</integer> <integer>38</integer>
</dict> </dict>
<key>Promises (Playground) 4.xcscheme</key> <key>Promises (Playground) 4.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key> <key>orderHint</key>
<integer>4</integer> <integer>39</integer>
</dict> </dict>
<key>Promises (Playground) 5.xcscheme</key> <key>Promises (Playground) 5.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key> <key>orderHint</key>
<integer>5</integer> <integer>40</integer>
</dict> </dict>
<key>Promises (Playground) 6.xcscheme</key> <key>Promises (Playground) 6.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key> <key>orderHint</key>
<integer>6</integer> <integer>41</integer>
</dict> </dict>
<key>Promises (Playground) 7.xcscheme</key> <key>Promises (Playground) 7.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key> <key>orderHint</key>
<integer>7</integer> <integer>42</integer>
</dict> </dict>
<key>Promises (Playground) 8.xcscheme</key> <key>Promises (Playground) 8.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key> <key>orderHint</key>
<integer>8</integer> <integer>43</integer>
</dict> </dict>
<key>Promises (Playground) 9.xcscheme</key> <key>Promises (Playground) 9.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key> <key>orderHint</key>
<integer>10</integer> <integer>44</integer>
</dict> </dict>
<key>Promises (Playground).xcscheme</key> <key>Promises (Playground).xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key> <key>orderHint</key>
<integer>0</integer> <integer>35</integer>
</dict> </dict>
</dict> </dict>
</dict> </dict>

View File

@ -546,8 +546,7 @@ class CCSpatialPhotoDisplayController: BaseController {
}else if(selectedIndex == 2){// }else if(selectedIndex == 2){//
var ri = joinImages_red_blue(lciImage: lciImage, rciImage: rciImage, scale: currentScale,rbImage: redBlueImage) var ri = joinImages_red_blue(lciImage: lciImage, rciImage: rciImage, scale: currentScale,rbImage: redBlueImage)
// var ri = UIImage(ciImage: lastImg) // ri = ri.getUpImg(imgOrigOritentation: self.imgOritentation )
ri = ri.getUpImg(imgOrigOritentation: self.imgOritentation )
redBlueImage = ri redBlueImage = ri
self.mImgView.image = ri self.mImgView.image = ri

View File

@ -158,10 +158,10 @@ extension CCSpatialPhotoDisplayController {
let edS = 20 // let edS = 20 //
var left = UIImage(ciImage: leftImage ) var left = UIImage(ciImage: leftImage )
left = left.getUpImg(imgOrigOritentation: imgOritentation) // left = left.getUpImg(imgOrigOritentation: imgOritentation)
var right = UIImage(ciImage: rightImage ) var right = UIImage(ciImage: rightImage )
right = right.getUpImg(imgOrigOritentation: imgOritentation) // right = right.getUpImg(imgOrigOritentation: imgOritentation)
// //
let (n_left,n_left_size) = getImgWithScale(image: left, scale: scale) let (n_left,n_left_size) = getImgWithScale(image: left, scale: scale)

View File

@ -18,11 +18,13 @@ extension CCSpatialShootController: AVCaptureAudioDataOutputSampleBufferDelegate
// //
func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) { func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
if shootingMode == .CCShootingMode_Camera && self.isTakePhoto{ if shootingMode == .CCShootingMode_Camera {
takePhotoSemaphore.wait() takePhotoSemaphore.wait()
if self.isTakePhoto {
print("xxsddd:\(Thread.current)") print("xxsddd:\(Thread.current)")
if output == wideAngleCameraVideoDataOutput && self.isTakePhoto_wideCamera { if output == wideAngleCameraVideoDataOutput && self.isTakePhoto_wideCamera {
if let firstFrame = imageFromSampleBuffer(sampleBuffer: sampleBuffer) { if let firstFrame = imageFromSampleBuffer(sampleBuffer: sampleBuffer,orientation: connection.videoOrientation) {
imgs.add(firstFrame) imgs.add(firstFrame)
self.isTakePhoto_wideCamera = false self.isTakePhoto_wideCamera = false
} }
@ -30,7 +32,7 @@ extension CCSpatialShootController: AVCaptureAudioDataOutputSampleBufferDelegate
print("wide Angle firstframe is lost....") print("wide Angle firstframe is lost....")
} }
} else if output == ultraWideCameraVideoDataOutput && self.isTakePhoto_ultraCamera{ } else if output == ultraWideCameraVideoDataOutput && self.isTakePhoto_ultraCamera{
if let firstFrame = imageFromSampleBuffer(sampleBuffer: sampleBuffer) { if let firstFrame = imageFromSampleBuffer(sampleBuffer: sampleBuffer,orientation: connection.videoOrientation) {
imgs.add(firstFrame) imgs.add(firstFrame)
self.isTakePhoto_ultraCamera = false self.isTakePhoto_ultraCamera = false
} }
@ -48,6 +50,8 @@ extension CCSpatialShootController: AVCaptureAudioDataOutputSampleBufferDelegate
else { else {
print("images 少于2张....") print("images 少于2张....")
} }
}
takePhotoSemaphore.signal() takePhotoSemaphore.signal()
} }
@ -80,24 +84,28 @@ extension CCSpatialShootController: AVCaptureAudioDataOutputSampleBufferDelegate
//samplebufferuiimage //samplebufferuiimage
func imageFromSampleBuffer(sampleBuffer: CMSampleBuffer) -> UIImage? { func imageFromSampleBuffer(sampleBuffer: CMSampleBuffer,orientation:AVCaptureVideoOrientation ) -> UIImage? {
//
guard let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return nil } guard let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return nil }
let ciImage = CIImage(cvPixelBuffer: imageBuffer)
// CoreImage let temporaryContext = CIContext(options: nil)
let ciImage = CIImage(cvImageBuffer: imageBuffer) guard let cgImage = temporaryContext.createCGImage(ciImage, from: ciImage.extent) else { return nil }
print("rect:\(ciImage.extent)")
// CIImageCGImage let image = UIImage(cgImage: cgImage, scale: UIScreen.main.scale, orientation: getImgOrientation(orientation: orientation))
if let cgImage = CIContext(options: nil).createCGImage(ciImage, from: ciImage.extent) {
// UIImage
let image = UIImage(cgImage: cgImage)
return image return image
} }
return nil func getImgOrientation(orientation:AVCaptureVideoOrientation )->UIImage.Orientation {
switch orientation {
case .portrait:
return .up
case .portraitUpsideDown:
return .down
case .landscapeRight:
return .right
case .landscapeLeft:
return .left
}
} }
@ -184,7 +192,7 @@ extension CCSpatialShootController: AVCaptureAudioDataOutputSampleBufferDelegate
let url = URL.documentsDirectory.appending(path:"aaa12.HEIC") let url = URL.documentsDirectory.appending(path:"aaa12.HEIC")
let destination = CGImageDestinationCreateWithURL(url as CFURL, UTType.heic.identifier as CFString, 2, nil)! let destination = CGImageDestinationCreateWithURL(url as CFURL, UTType.heic.identifier as CFString, 2, nil)!
var oo = imageCGImagePropertyOrientation.rawValue var oo = imageCGImagePropertyOrientation.rawValue
let orientation_cf = CFNumberCreate(nil, CFNumberType.intType, &oo) // let orientation_cf = CFNumberCreate(nil, CFNumberType.intType, &oo)
let properties1 = [ let properties1 = [
kCGImagePropertyGroups: [ kCGImagePropertyGroups: [
kCGImagePropertyGroupIndex: 0, kCGImagePropertyGroupIndex: 0,
@ -192,11 +200,11 @@ extension CCSpatialShootController: AVCaptureAudioDataOutputSampleBufferDelegate
kCGImagePropertyGroupImageIndexLeft: 0, kCGImagePropertyGroupImageIndexLeft: 0,
kCGImagePropertyGroupImageIndexRight: 1, kCGImagePropertyGroupImageIndexRight: 1,
], ],
kCGImagePropertyTIFFDictionary:[ // kCGImagePropertyTIFFDictionary:[
kCGImagePropertyOrientation:orientation_cf, // kCGImagePropertyOrientation:orientation_cf,
], // ],
//
kCGImagePropertyOrientation:orientation_cf as Any, // kCGImagePropertyOrientation:orientation_cf as Any,
kCGImagePropertyHEIFDictionary: [ kCGImagePropertyHEIFDictionary: [
kIIOMetadata_CameraExtrinsicsKey: [ kIIOMetadata_CameraExtrinsicsKey: [
kIIOCameraExtrinsics_CoordinateSystemID: 0, kIIOCameraExtrinsics_CoordinateSystemID: 0,
@ -220,10 +228,10 @@ extension CCSpatialShootController: AVCaptureAudioDataOutputSampleBufferDelegate
kCGImagePropertyGroupImageIndexLeft: 0, kCGImagePropertyGroupImageIndexLeft: 0,
kCGImagePropertyGroupImageIndexRight: 1, kCGImagePropertyGroupImageIndexRight: 1,
], ],
kCGImagePropertyTIFFDictionary:[ // kCGImagePropertyTIFFDictionary:[
kCGImagePropertyOrientation:orientation_cf, // kCGImagePropertyOrientation:orientation_cf,
], // ],
kCGImagePropertyOrientation:orientation_cf as Any, // kCGImagePropertyOrientation:orientation_cf as Any,
kCGImagePropertyHEIFDictionary: [ kCGImagePropertyHEIFDictionary: [
kIIOMetadata_CameraExtrinsicsKey: [ kIIOMetadata_CameraExtrinsicsKey: [