質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

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

Q&A

解決済

1回答

1352閲覧

AVFoundationを使ったcaptureOutputが呼ばれない

nasutaro211

総合スコア21

Swift

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

0グッド

0クリップ

投稿2018/07/06 23:23

編集2018/07/06 23:25

AVFoundation周りのことで困っています。

無音カメラの実装をしているのですが、ビデオフレームが書き込まれたことを通知されて動くはずのメソッドであるcaptureOutput(_:didOutput:from:)が呼ばれません。

次のことは確認してあります。

  1. output.sampleBufferDelegateCameraViewControllerが入っていること
  2. カメラで写した画がiPhone上に表示されること

ソースコードは次のようです。

swift

1class CameraViewController: UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate { 2 3 var input:AVCaptureDeviceInput! 4 var output:AVCaptureVideoDataOutput! 5 var session:AVCaptureSession! 6 var camera:AVCaptureDevice! 7 var imageView:UIImageView! 8 var videoPreviewLayer:AVCaptureVideoPreviewLayer? 9 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 14 } 15 16 override func viewWillAppear(_ animated: Bool) { 17 // スクリーン設定 18 setupDisplay() 19 20 // カメラの設定 21 setupCamera() 22 } 23 24 25 func setupDisplay(){ 26 //スクリーンの幅 27 let screenWidth = UIScreen.main.bounds.size.width; 28 //スクリーンの高さ 29 let screenHeight = UIScreen.main.bounds.size.height; 30 31 // カメラからの映像を映すimageViewの作成 32 if let iv = imageView { 33 //以前のimageViewがあれば剥がしておく(imageViewが残っていないか確認最初は入ってない) 34 iv.removeFromSuperview() 35 } 36 imageView = UIImageView() 37 imageView.frame = CGRect(x: 0.0, y: 0.0, width: screenWidth ,height: screenHeight) 38 view.addSubview(imageView) 39 view.sendSubview(toBack: imageView) 40 } 41 42 func setupCamera(){ 43 // AVCaptureSession: キャプチャに関する入力と出力の管理 44 session = AVCaptureSession() 45 46 // sessionPreset: キャプチャ・クオリティの設定 47 session.sessionPreset = .photo// 48 49 // AVCaptureDevice: カメラやマイクなどのデバイスを設定 50 for caputureDevice: AnyObject in AVCaptureDevice.devices() { 51 // 背面カメラを取得 52 if caputureDevice.position == AVCaptureDevice.Position.back { 53 camera = caputureDevice as? AVCaptureDevice 54 break 55 } 56 } 57 58 // カメラからの入力データ 59 do { 60 input = try AVCaptureDeviceInput(device: camera) as AVCaptureDeviceInput 61 } catch let error as NSError { 62 print(error) 63 } 64 65 // 入力をセッションに追加 66 if(session.canAddInput(input)) { 67 session.addInput(input) 68 } 69 70 // AVCaptureVideoDataOutput:動画フレームデータを出力に設定 71 output = AVCaptureVideoDataOutput() 72 // 出力をセッションに追加 73 if(session.canAddOutput(output)) { 74 session.addOutput(output) 75 } 76 77 // ピクセルフォーマットを 32bit BGR + A とする 78 output.videoSettings = 79 [kCVPixelBufferPixelFormatTypeKey as AnyHashable as! 80 String : Int(kCVPixelFormatType_32BGRA)] 81 // フレームをキャプチャするためのサブスレッド用のシリアルキューを用意 82 output.setSampleBufferDelegate(self, queue: DispatchQueue.main) 83 //追加したコード 84 videoPreviewLayer = AVCaptureVideoPreviewLayer(session: session) 85 videoPreviewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill 86 videoPreviewLayer?.frame = view.layer.bounds 87 view.layer.insertSublayer(videoPreviewLayer!, below: nil) 88// view.layer.addSublayer(videoPreviewLayer!) 89 90 91 output.alwaysDiscardsLateVideoFrames = true 92 93 session.startRunning() 94 95 // deviceをロックして設定 96 do { 97 try camera.lockForConfiguration() 98 // フレームレート 99 camera.activeVideoMinFrameDuration = CMTimeMake(1, 30) 100 camera.unlockForConfiguration() 101 } catch _ { 102 } 103 } 104 105 106 // 新しいキャプチャの追加で呼ばれる 107 func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!) { 108 print("呼ばれてくれ...") 109 } 110 111 112 override func didReceiveMemoryWarning() { 113 super.didReceiveMemoryWarning() 114 // Dispose of any resources that can be recreated. 115 } 116}

気になる点としては

  1. どのタイミングでcaptureOutput(_:didOutput:from:)が呼ばれるか
  2. これでうまくdelegateの設定ができているのか?

の2点です。
他にも呼ばれない理由があるのかわからないのであれば教えて欲しいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

delegateメソッドの名前が一昔前のものになっていたのが原因でした。
ちゃんとdelegateプロトコルの定義を見てあげればわかるということが今回の学びです。

投稿2018/07/07 00:00

nasutaro211

総合スコア21

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問