1

ビデオサブレイヤーを追加してカメラを呼び出す2番目のビューコントローラーを呼び出すボタンを持つビューコントローラーがあります。

別のボタンなどを2番目のviewcontrollerに追加しようとするまで、コードは正常に機能していましたが、機能する場合と機能しない場合があります。

「機能しない」とは、何もない黒い画面を開くことを意味します。何にも反応しません。

ボタン/コードなどを削除しましたが、何も修正されていません。

時々それはうまくいくようです。つまり、機能した後、ボタンを追加したりコードを変更したりできます。機能すると、再び黒い画面が表示されます。

ビルド エラーやトレースはなく、基本的にはそこに座って何かをするのを待っています (記録ボタンを押すなど) が、何も表示されません。

「サブビューを前面に表示」する必要があることを読みましたが、それは何もしていないようです。

助言がありますか?

前もって感謝します。

更新: 関連するものを見つけたと思います。CGRect を使用してプログラムで画面にボタンを配置しようとしていましたが、その一部にはテキスト ビューの幅と高さの取得が含まれていました。

「オプションの値を見つけることが期待されていましたが、nil が見つかりました」というメッセージでコードがクラッシュしたことがわかりました。

最初は自分のコードだと思っていましたが、同じコードを使用して別の VC で試した後、突然再び機能し始めました。つまり、textView.frame.width と textView.frame.height の値を取得します。

そして、私のカメラがプレビューを表示し始めました!

したがって、プレビューが黒の場合は、ボタンとテキスト ビューに値がないと考えられます。

let captureSession = AVCaptureSession()

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.


    captureSession.sessionPreset = AVCaptureSession.Preset.high

    // loop through all devices looking for cameras
    let deviceDiscoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [AVCaptureDevice.DeviceType.builtInWideAngleCamera], mediaType: AVMediaType.video, position: AVCaptureDevice.Position.unspecified)
    let devices = deviceDiscoverySession.devices

    for device in devices {
        if (device.hasMediaType(AVMediaType.video)) {
            if device.position == AVCaptureDevice.Position.back {
                backCamera = device
            } else if device.position == AVCaptureDevice.Position.front {
                frontCamera = device
            }
        }
    }
    currentDevice = frontCamera

    // look through all devices looking for microphone
    let audioDiscoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [AVCaptureDevice.DeviceType.builtInMicrophone], mediaType: AVMediaType.audio, position: AVCaptureDevice.Position.unspecified)
    let audioDevices = audioDiscoverySession.devices

    for audioDevice in audioDevices {
        if (audioDevice.hasMediaType(AVMediaType.audio)) {
            audioCapture = audioDevice
        }
    }

// set up input output
    do {
        // setup camera input
        let captureDeviceInput = try AVCaptureDeviceInput(device: currentDevice!)
        captureSession.addInput(captureDeviceInput)
        // setup audio input
        let captureDeviceAudio = try AVCaptureDeviceInput(device: audioCapture!)
        captureSession.addInput(captureDeviceAudio)

        videoFileOutput = AVCaptureMovieFileOutput()
        captureSession.addOutput(videoFileOutput!)

    } catch {
        print(error)
    }

    cameraPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
    cameraPreviewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill

    cameraPreviewLayer?.connection?.videoOrientation = currentVideoOrientation()

    cameraPreviewLayer?.frame = self.view.frame

    self.view.layer.insertSublayer(cameraPreviewLayer!, at: 0)

     captureSession.startRunning()

}
4

2 に答える 2