質問編集履歴

2 誤字があったので修正しました

ghana

ghana score 12

2016/10/03 22:34  投稿

[Swift3.0 xcode8.0] カメラを呼び出す際の"device()"が非推奨
[Swift3.0 xcode8.0] カメラを呼び出す際の"devices()"が非推奨
###前提・実現したいこと
カメラを使ったアプリケーションの開発を行っています。
最近xcode8.0とiOS10.0にアップデートしました。アップデートをした初期は実機テストでアプリケーションが動いていることは確認できていましたが、つい最近コードを少々書き足したところで実機テストを行うと、
"Thread 6:signal SIGABRT"と出てしまいアプリが落ちてしまうようになりました。
storyboardの紐付けもしっかり確認しましたが、いたって正常でした。変更前のプロジェクトも試してみたのですが同じ結果でした。
そこで、もう一度コードを確認してみたところこのような警告が一つだけあって、もしやこれなのではないかと考えました。コード自体は参考にしている部分が多く、深く理解できていません。
そこで質問なのですが、代わりにAVCaptureDeviceDiscoverySessionを使うにはどのように変更すれば良いのでしょうか。
###発生している問題・エラーメッセージ
```
'device()' was deprecated on iOS 10.0: Use AVCaptureDeviceDiscoverySession instead.
'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
  • iOS

    4801 questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

  • Xcode

    5064 questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

  • Swift

    8991 questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

1 コードが不十分だったので書き加えました

ghana

ghana score 12

2016/10/03 22:31  投稿

[Swift3.0 xcode8.0] カメラを呼び出す際の"device()"が非推奨
###前提・実現したいこと
カメラを使ったアプリケーションの開発を行っています。
最近xcode8.0とiOS10.0にアップデートしました。アップデートをした初期は実機テストでアプリケーションが動いていることは確認できていましたが、つい最近コードを少々書き足したところで実機テストを行うと、
"Thread 6:signal SIGABRT"と出てしまいアプリが落ちてしまうようになりました。
storyboardの紐付けもしっかり確認しましたが、いたって正常でした。変更前のプロジェクトも試してみたのですが同じ結果でした。
そこで、もう一度コードを確認してみたところこのような警告が一つだけあって、もしやこれなのではないかと考えました。コード自体は参考にしている部分が多く、深く理解できていません。
そこで質問なのですが、代わりにAVCaptureDeviceDiscoverySessionを使うにはどのように変更すれば良いのでしょうか。
###発生している問題・エラーメッセージ
```
'device()' 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
  • iOS

    4801 questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

  • Xcode

    5064 questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

  • Swift

    8991 questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る