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

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

ただいまの
回答率

90.51%

  • Swift

    8750questions

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

  • iOS 9

    215questions

    iOS 9は、アップル社のモバイルOSであるiOSシリーズのバージョン。特徴として検索機能の強化、Siriの機能改良、iPad向けマルチタスクなどがあります。マルチウィンドウ機能をサポートし、iPad向けマルチタスクもサポートされています。

Swiftでの動画撮影アプリ作成時のエラー

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 980

codack1969

score 1

iOSアプリ開発を初めて1ヶ月の初心者です。
環境はXcode7.2
使用言語はSwift

こちらのサイトを元にして、最新のコードに書き換えつつ動画撮影アプリを作成していますがエラーが解消できません。
参考サイト:https://sites.google.com/a/gclue.jp/swift-docs/ni-yinki100-ios/3-avfoundation/003-dong-huano-cuo-ying
リンク内容

下記に示すコードを記述し、ビルドしたところデバッグエリアに次のエラーが表示されます。

2016-02-14 01:50:53.095 sampleVideo2[4602:3119552] * Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '* -[AVCaptureDevice init:] - cannot instantiate a AVCaptureDevice directly.'
*** First throw call stack:
(0x1824cd900 0x181b3bf80 0x18874a36c 0x1000d1994 0x1000d108c 0x1000cd9c4 0x1000cfc6c 0x1871c00c0 0x1871d84a8 0x187371ce4 0x18727e9b8 0x18727e694 0x18727e5fc 0x1871bb778 0x184bcab2c 0x184bc5738 0x184bc55f8 0x184bc4c94 0x184bc49dc 0x1871be944 0x182484efc 0x182484990 0x182482690 0x1823b1680 0x1838c0088 0x187228d90 0x1000cd6f0 0x181f528b8)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb) 

さらにAppDelegateのクラス名の行(以下)にエラーメッセージ「signal SIGARBT」が表示されます。

class AppDelegate: UIResponder, UIApplicationDelegate {

自力で調べても解決できず苦戦しておりますのでアドバイスいただけますと幸いです。
よろしくお願いします。

import UIKit
import AVFoundation

class ViewController: UIViewController, AVCaptureFileOutputRecordingDelegate {

    //ビデオのアウトプット
    private var myVideoOutPut:AVCaptureMovieFileOutput!

    //スタート&ストップボタン
    private var myButtonStart : UIButton!
    private var myButtonStop : UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()

        //セッションの作成
        let mySession : AVCaptureSession = AVCaptureSession()

        //デバイス
        var myDevice : AVCaptureDevice = AVCaptureDevice()

        //出力先の設定
        let myImageOutput : AVCaptureStillImageOutput = AVCaptureStillImageOutput()


        //デバイス一覧の取得
        let devices = AVCaptureDevice.devices()

        //マイクを取得
        //マイクをセッションのInputに追加
        do{
            let audioCaptureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeAudio)
            let audioInput = try AVCaptureDeviceInput(device: audioCaptureDevice)
            if (mySession.canAddInput(audioInput)){
                mySession.addInput(audioInput)
            }
        }catch let error as NSError{
            print(error)
        }

        //バックライトをmyDeviceに格納
        for device in devices {
            if (device.position == AVCaptureDevicePosition.Back){
                myDevice = device as! AVCaptureDevice
            }
        }

        //バックカメラを取得
        do{
            let videoCaptureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
            let videoInput = try AVCaptureDeviceInput(device: videoCaptureDevice)
            //ビデオをセッションのInputに追加
            if (mySession.canAddInput(videoInput)){
                mySession.addInput(videoInput)
            }
        }catch let error as NSError{
            print(error)
        }


        //セッションに出力先を追加
        mySession.addOutput(myImageOutput)

        //動画の保存
        myVideoOutPut = AVCaptureMovieFileOutput()

        //ビデオ出力をOutputに追加
        mySession.addOutput(myVideoOutPut)

        //画像を表示するレイヤーを生成
        let myVideoLayer:AVCaptureVideoPreviewLayer = AVCaptureVideoPreviewLayer(session: mySession)
        myVideoLayer.frame = self.view.bounds
        myVideoLayer.videoGravity = AVLayerVideoGravityResizeAspectFill

        //viewに追加
        self.view.layer.addSublayer(myVideoLayer)

        //セッション開始
        mySession.startRunning()

        // UIボタン作成
        myButtonStart = UIButton(frame: CGRectMake(0,0,120,50))
        myButtonStop = UIButton(frame: CGRectMake(0,0,120,50))

        myButtonStart.backgroundColor = UIColor.redColor()
        myButtonStop.backgroundColor = UIColor.grayColor()

        myButtonStart.layer.masksToBounds = true
        myButtonStop.layer.masksToBounds = true

        myButtonStart.setTitle("撮影", forState: .Normal)
        myButtonStop.setTitle("停止", forState: .Normal)

        myButtonStart.layer.cornerRadius = 20
        myButtonStop.layer.cornerRadius = 20


        myButtonStart.layer.position = CGPoint(x: self.view.bounds.width/2 - 70, y: self.view.bounds.height-50)
        myButtonStop.layer.position = CGPoint(x: self.view.bounds.width/2 - 70, y: self.view.bounds.height-50)

        myButtonStart.addTarget(self, action: "onClickMyButton:", forControlEvents: .TouchUpInside)
        myButtonStop.addTarget(self, action: "onClickMyButton:", forControlEvents: .TouchUpInside)

        //UIボタンをViewに追加
        self.view.addSubview(myButtonStart)
        self.view.addSubview(myButtonStop)
    }

    //ボタンイベント
    internal func onClickMyButton(sender:UIButton){
        //撮影開始
        if sender == myButtonStart {
            let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)

            //フォルダ
            let documentsDirectory = paths[0] as! String

            //ファイル名
            let filePath:String? = "\(documentsDirectory)/test.mp4"

            //URL
            let fileURL:NSURL = NSURL(fileURLWithPath: filePath!)

            //録画開始
            myVideoOutPut.startRecordingToOutputFileURL(fileURL, recordingDelegate: self)

        } else if sender == myButtonStop {
            myVideoOutPut.stopRecording()

        }
    }

    //動画がキャプチャーされた後に呼ばれるメソッド
    func captureOutput(captureOutput: AVCaptureFileOutput!, didFinishRecordingToOutputFileAtURL outputFileURL: NSURL!, fromConnections connections: [AnyObject]!, error: NSError!) {
        print("didFinishRecordingToOutputFileAtURL")
    }

    //動画のキャプチャーが開始された時に呼ばれるメソッド
    func captureOutput(captureOutput: AVCaptureFileOutput!, didStartRecordingToOutputFileAtURL fileURL: NSURL!, fromConnections connections: [AnyObject]!) {
        print("didStartRecordingToOutputFileAtURL")
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    // Get the new view controller using segue.destinationViewController.
    // Pass the selected object to the new view controller.
    }
    */

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

背面カメラを使用するコードになっていますが、実行しているiPhone/iPod touchには背面カメラはついていますでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/14 12:40

    背面カメラついています。iPhone6、iOS9.2.1で実機テストしています。

    キャンセル

同じタグがついた質問を見る

  • Swift

    8750questions

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

  • iOS 9

    215questions

    iOS 9は、アップル社のモバイルOSであるiOSシリーズのバージョン。特徴として検索機能の強化、Siriの機能改良、iPad向けマルチタスクなどがあります。マルチウィンドウ機能をサポートし、iPad向けマルチタスクもサポートされています。