2016-05-01 21 views
0

私は迅速にライブフィルタカメラアプリを構築しています。SwiftのAVFoundationで写真をキャプチャ

私は、写真撮影機能を実行するためにAVCaptureVideoDataOutput()からAVCaptureStillImageOutput()に変更しています。私が変更した後、私はアプリを開くと、プレビュービューがありません。

メインのグループ領域をクリックすると、キャプチャ写真機能が動作しているので、キャプチャサウンド "Ka"を聞くことができます。ここには見解はありません。

は、ここに私の完全なコード

import Foundation 
import UIKit 
import AVFoundation 
import CoreMedia 

let CIHueAdjust = "CIHueAdjust" 
let CIHueAdjustFilter = CIFilter(name: "CIHueAdjust", withInputParameters: ["inputAngle" : 1.24]) 

let Filters = [CIHueAdjust: CIHueAdjustFilter] 

let FilterNames = [String](Filters.keys).sort() 

class LiveCamViewController :  UIViewController,AVCaptureVideoDataOutputSampleBufferDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate{ 
let mainGroup = UIStackView() 
let imageView = UIImageView(frame: CGRectZero) 
let filtersControl = UISegmentedControl(items: FilterNames) 
var videoOutput = AVCaptureStillImageOutput() 

override func viewDidLoad() 
{ 
    super.viewDidLoad() 

    view.addSubview(mainGroup) 
    mainGroup.axis = UILayoutConstraintAxis.Vertical 
    mainGroup.distribution = UIStackViewDistribution.Fill 

    mainGroup.addArrangedSubview(imageView) 
    mainGroup.addArrangedSubview(filtersControl) 
    mainGroup.addGestureRecognizer(UITapGestureRecognizer(target: self, action:#selector(LiveCamViewController.saveToCamera(_:)))) 

    imageView.contentMode = UIViewContentMode.ScaleAspectFit 

    filtersControl.selectedSegmentIndex = 0 

    let captureSession = AVCaptureSession() 
    captureSession.sessionPreset = AVCaptureSessionPresetPhoto 

    let backCamera = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo) 

    do 
    { 
     let input = try AVCaptureDeviceInput(device: backCamera) 

     captureSession.addInput(input) 
    } 
    catch 
    { 
     print("can't access camera") 
     return 
    } 

    //get captureOutput invoked 
    let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) 
    view.layer.addSublayer(previewLayer) 

    videoOutput.outputSettings = [AVVideoCodecKey:AVVideoCodecJPEG] 

    if captureSession.canAddOutput(videoOutput) 
    { 
     captureSession.addOutput(videoOutput) 
    } 

    captureSession.startRunning() 
} 

func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!) 
{ 
    guard let filter = Filters[FilterNames[filtersControl.selectedSegmentIndex]] else 
    { 
     return 
    } 

    let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) 
    let cameraImage = CIImage(CVPixelBuffer: pixelBuffer!) 

    filter!.setValue(cameraImage, forKey: kCIInputImageKey) 

    let filteredImage = UIImage(CIImage: filter!.valueForKey(kCIOutputImageKey) as! CIImage!) 
    let fixedImage = correctlyOrientedImage(filteredImage) 

    dispatch_async(dispatch_get_main_queue()) 
    { 
     self.imageView.image = fixedImage 
    } 

} 

func correctlyOrientedImage(image: UIImage) -> UIImage { 

    UIGraphicsBeginImageContextWithOptions(image.size, false, image.scale) 
    image.drawInRect(CGRectMake(0, 0, image.size.width, image.size.height)) 
    let normalizedImage:UIImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    let imageRef: CGImageRef = normalizedImage.CGImage! 
    let rotatedImage: UIImage = UIImage(CGImage: imageRef, scale: 1.0, orientation: .Right) 

    return rotatedImage 
} 

override func viewDidLayoutSubviews() 
{ 
    mainGroup.frame = CGRect(x: 37, y: 115, width: 301, height: 481) 
} 

func saveToCamera(sender: UITapGestureRecognizer) { 

    videoOutput.outputSettings = [AVVideoCodecKey:AVVideoCodecJPEG] 

    if let videoConnection = videoOutput.connectionWithMediaType(AVMediaTypeVideo) { 
     videoOutput.captureStillImageAsynchronouslyFromConnection(videoConnection) { 
      (imageDataSampleBuffer, error) -> Void in 
      let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageDataSampleBuffer) 
      UIImageWriteToSavedPhotosAlbum(UIImage(data: imageData)!, nil, nil, nil) 
     } 
    } 
} 

} 

おかげです。

+0

スウィフトにAVCaptureSessionで画像をキャプチャする[方法の可能性のある重複を? ](http://stackoverflow.com/questions/28756363/how-to-capture-picture-with-avcapturesession-in-swift) – iYoung

+0

あなたはこれを参照できますhttp://stackoverflow.com/questions/25871513/swift-take -photo-from-avfoundation?rq = 1 – iYoung

+0

音が聞こえる場合。おそらくあなたのコードはAvfoundationのために働いています。あなたのビューレイアウト(autolayout)またはアウトレットは、 – Shubhank

答えて

0

カメラから写真やビデオをキャプチャする場合は、代わりにAVFoundationを使用してください。UIImagePickerController詳細については、Applce documentationを参照してください。

更新:

this linkを参照してください。それは、カスタマイズの例があまりにも多いimagePickercontrollerです。あなたはthisthisのstackobverflowの回答を参照することができます。これが役立つ

希望:)

+0

申し訳ありませんが、私はuiimagepickercontrollerがiphoneのカメラにアクセスすることを許可していると思います。現在、私は自分のアプリケーションで完全にカスタマイズされたカメラを構築しようとしています。 – dididaisy

+0

imagePickerControllerをあるレベルでカスタマイズすることもできます! – Lion

+0

あなたはそのことをどうやって考えているのですか? – dididaisy

0

あなたはpreviewLayerためのフレームを持っていないため、問題があるかもしれません。

タイプこの:

previewLayer.frame = self.view.bounds

も明示的にビデオ重力を設定します(私はこれはオプションだと思う)

previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill // Or choose some other option if you prefer 
+0

で確認してください。こんにちは、あなたの答えはthxです。できます。しかし、フィルタは消えています..スクリーン上にはライブフィルタのカバーはありません。私はここで質問する必要がありますか、新しい質問を開くべきですか?ありがとう! – dididaisy

+0

プレビューレイヤを設定してプレゼンテーションした後にフィルタを追加すると効果があります。プレビューレイヤーを表示する前にビューに追加されているため、プレビューレイヤーの下に表示されている可能性があります。ですから、 'view.addSubview(previewLayer)'の下に 'view.addSubview(mainGroup)'を追加すれば動作します。私の答えがあなたにとって正しいものだったら、それを受け入れてupvoteしてください。 (灰色の目盛りボタンを押し、答えに残っている数字の上にある上矢印を押してください) – Lawrence413

関連する問題