我正在使用AvFoundation
作为相机。
这是我的实时预览:
看起来不错。当用户按下"按钮"我在同一个屏幕上创建快照。 (喜欢Snapchat)
我使用以下代码捕获图像并在屏幕上显示:
self.stillOutput.captureStillImageAsynchronouslyFromConnection(videoConnection){
(imageSampleBuffer : CMSampleBuffer!, _) in
let imageDataJpeg = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageSampleBuffer)
let pickedImage: UIImage = UIImage(data: imageDataJpeg)!
self.captureSession.stopRunning()
self.previewImageView.frame = CGRect(x:0, y:0, width:UIScreen.mainScreen().bounds.width, height:UIScreen.mainScreen().bounds.height)
self.previewImageView.image = pickedImage
self.previewImageView.layer.zPosition = 100
}
用户捕获图像后,屏幕如下所示:
请查看标记区域。它没有在实时预览屏幕上查看(截图1)。
我的意思是实时预览并没有显示所有内容。但我确信我的实时预览效果很好,因为我与其他相机应用程序进行了比较,所有内容都与我的实时预览屏幕相同。我想我拍摄的图片有问题。
我正在使用以下代码创建实时预览:
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
captureSession.sessionPreset = AVCaptureSessionPresetPhoto
let devices = AVCaptureDevice.devices()
for device in devices {
// Make sure this particular device supports video
if (device.hasMediaType(AVMediaTypeVideo)) {
// Finally check the position and confirm we've got the back camera
if(device.position == AVCaptureDevicePosition.Back) {
captureDevice = device as? AVCaptureDevice
}
}
}
if captureDevice != nil {
beginSession()
}
}
func beginSession() {
let err : NSError? = nil
do {
try captureSession.addInput(AVCaptureDeviceInput(device: captureDevice))
} catch{
}
captureSession.addOutput(stillOutput)
if err != nil {
print("error: \(err?.localizedDescription)")
}
previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
previewLayer?.videoGravity=AVLayerVideoGravityResizeAspectFill
self.cameraLayer.layer.addSublayer(previewLayer!)
previewLayer?.frame = self.cameraLayer.frame
captureSession.startRunning()
}
我的cameraLayer
:
如何解决此问题?
答案 0 :(得分:0)
据推测,您正在使用AVCaptureVideoPreviewLayer。所以听起来这个图层放置不正确或大小不正确,或者它有错误的AVLayerVideoGravity设置。部分图像不在屏幕上或裁剪;这就是为什么你在预览时看不到相机所看到的部分的原因。
答案 1 :(得分:0)
好的,我找到了解决方案。
我用过
#container {
...
white-space: nowrap;
}
而不是
captureSession.sessionPreset = AVCaptureSessionPresetHigh
然后问题解决了。