###前提・実現したいこと
カメラを使ったアプリケーションの開発を行っています。
最近xcode8.0とiOS10.0にアップデートしました。アップデートをした初期は実機テストでアプリケーションが動いていることは確認できていましたが、つい最近コードを少々書き足したところで実機テストを行うと、
"Thread 6:signal SIGABRT"と出てしまいアプリが落ちてしまうようになりました。
storyboardの紐付けもしっかり確認しましたが、いたって正常でした。変更前のプロジェクトも試してみたのですが同じ結果でした。
そこで、もう一度コードを確認してみたところこのような警告が一つだけあって、もしやこれなのではないかと考えました。コード自体は参考にしている部分が多く、深く理解できていません。
そこで質問なのですが、代わりにAVCaptureDeviceDiscoverySessionを使うにはどのように変更すれば良いのでしょうか。
###発生している問題・エラーメッセージ
'devices()' was deprecated on iOS 10.0: Use AVCaptureDeviceDiscoverySession instead.
コードは以下のようになります。警告は let device = AVCaptureDevice.device()の行に現れました
また、ブレークポイントを付けて一つずつ確認したところ最後のreturn trueの次の } で先ほどのように止まってしまいました。
###該当のソースコード
//セッション キャプチャに関する入力と出力の管理 var mySession : AVCaptureSession! //カメラデバイス カメラやマイクといったデバイスそのものを表現 var myDevice : AVCaptureDevice! //出力先 サブクラス 動画フレームデータ var myOutput : AVCaptureVideoDataOutput! //SpeechSynthesizerクラス var talker = AVSpeechSynthesizer() override func viewDidLoad() { super.viewDidLoad() //カメラを準備 if initCamera(){ mySession.startRunning() } } // カメラの準備処理 func initCamera() -> Bool { // セッションの作成. mySession = AVCaptureSession() // 解像度の指定. mySession.sessionPreset = AVCaptureSessionPreset640x480 // デバイス一覧の取得. let devices = AVCaptureDevice.devices() // バックカメラをmyDeviceに格納. for device in devices! { //前面カメラを取得 //if(device.position == AVCaptureDevicePosition.Front){ //背面カメラの取得 if((device as AnyObject).position == AVCaptureDevicePosition.back){ myDevice = device as! AVCaptureDevice } } if myDevice == nil { return false } // バックカメラからVideoInputを取得. var myInput: AVCaptureDeviceInput! = nil do { myInput = try AVCaptureDeviceInput(device: myDevice) as AVCaptureDeviceInput } catch let error { print(error) } // セッションに追加. if mySession.canAddInput(myInput) { mySession.addInput(myInput) } else { return false } // 出力先を設定 myOutput = AVCaptureVideoDataOutput() myOutput.videoSettings = [ kCVPixelBufferPixelFormatTypeKey as AnyHashable: Int(kCVPixelFormatType_32BGRA) ] // FPSを設定 do { try myDevice.lockForConfiguration() myDevice.activeVideoMinFrameDuration = CMTimeMake(1, 30) myDevice.unlockForConfiguration() } catch let error { print("lock error: \(error)") return false } // デリゲートを設定 let queue: DispatchQueue = DispatchQueue(label: "myqueue", attributes: []) myOutput.setSampleBufferDelegate(self, queue: queue) // 遅れてきたフレームは無視するかしないか myOutput.alwaysDiscardsLateVideoFrames = true // セッションに追加. if mySession.canAddOutput(myOutput) { mySession.addOutput(myOutput) } else { return false } // カメラの向きを合わせる for connection in myOutput.connections { if let conn = connection as? AVCaptureConnection { if conn.isVideoOrientationSupported { conn.videoOrientation = AVCaptureVideoOrientation.portrait } } } return true }
お手数ですがご教授願います。
環境
iPhone5
xcode8.0
swift3
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/10/03 14:55
2016/10/03 14:56