2

iOSでビデオを録画する簡単な方法は、AVCaptureSession.sessionPresetを設定することです。プリセットを使用せずにiOSに動画を録画するにはどうすればよいですか?

しかし、私はビニング、安定化(映画、標準、またはなし)とISOのようなパラメータを制御したいので、それは私のためには機能しません。

私は私が欲しいフォーマットを見つけてactiveFormatに割り当てるが、私は録音を開始しようとすると、私はエラーを取得する:ここで

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 
'*** -[AVCaptureMovieFileOutput startRecordingToOutputFileURL:recordingDelegate:] No active/enabled connections' 

は私の初期化コードは次のとおりです。

let device = AVCaptureDevice.defaultDevice(
    withDeviceType: .builtInWideAngleCamera, 
    mediaType: AVMediaTypeVideo, 
    position: .back)! 
let session = AVCaptureSession() 
session.addInput(try! AVCaptureDeviceInput(device: device)) 
output = AVCaptureMovieFileOutput() 
session.addOutput(output) 
device.setFormatWithHighestIso() 
session.startRunning() 

setFormatWithHighestIso()

extension AVCaptureDevice { 
    var goodVideoFormats: [AVCaptureDeviceFormat] { 
    return (formats as! [AVCaptureDeviceFormat]) 
     .filter { CMFormatDescriptionGetMediaSubType($0.formatDescription) != 875704422 } // 420f 
     .filter { $0.autoFocusSystem == .phaseDetection } 
    } 

    func setFormatWithHighestIso() { 
    let format = goodVideoFormats 
     .filter { $0.maxISO > 1759 } 
     .filter { $0.height < 1937 } 
     .first! 

    try! lockForConfiguration() 
    defer { unlockForConfiguration() } 
    activeFormat = format 
    NSLog("\(format)") 
    } 
} 

最終ログステートメントは次のように定義されます。

<AVCaptureDeviceFormat: 0x1702027d0 'vide'/'420f' 2592x1936, { 3- 30 fps}, HRSI:4032x3024, fov:58.986, max zoom:189.00 (upscales @1.56), AF System:2, ISO:22.0-1760.0, SS:0.000005-0.333333, supports wide color> 

これは実際に私が望む形式なので、setFormatWithHighestIso()は期待どおりに動作しています。 Apple referenceを参照してください。


いくつかの他のものは、私が試した:

  • 代わり420Fの420Vを使用して、== 875704422へ=変更して!を。
  • カメラをフォトモードで起動する代わりに、ビデオモードで起動し、AVCapturePhotoOutputを削除してAVCaptureMovieFileOutputを追加してビデオモードに変更します。
  • AVCaptureConnectionが有効であることを確認します。
  • 接続がアクティブであるが、それがないことを確認する:

    CONN = output.connection(withMediaType:AVMediaTypeVideo)しましょう!

を(conn.isActive)を確認 私はまた、いくつかの他のAVCaptureDeviceFormatsを使用してみました、そして、彼らは働く:

extension AVCaptureDevice { 
    func setFormatWithCinematicVS() { 
    let format = goodVideoFormats 
     .filter { $0.isVideoStabilizationModeSupported(.cinematic) } 
     .filter { $0.height == 720 } 
     .first! 

    try! lockForConfiguration() 
    defer { unlockForConfiguration() } 
    activeFormat = format 
    } 

    func setFormatWithStandardVS() { 
    let format = goodVideoFormats 
     .filter { $0.isVideoStabilizationModeSupported(.standard) } 
     .filter { $0.height == 540 } 
     .first! 

    try! lockForConfiguration() 
    defer { unlockForConfiguration() } 
    activeFormat = format 
    } 
} 

それは動作しません、最高ISOとの唯一の形式です。このフォーマットの特色は何ですか?

AVCaptureConnectionを手動で作成する必要がありますか?しかし、すでにつながりがあります。それは単に活発ではない。

これはiOS 10.3.3を実行しているiPhone 7 Plusにあります。セッションを使用せずにactiveFormatを設定して、特定の形式でビデオを記録するにはどうすればよいですか?

activeFormatに割り当てる代わりに、私はsessionPresetを使用しますが、ビデオを正常に記録します。


このエラーメッセージについて他の質問がありますが、特にプリセットを使用せずにビデオをキャプチャする必要があるので、このエラーメッセージの欺瞞ではありません。

+0

私はこれを試してみたいが、7+がない - 他のモデルに類似のエラーはない?エラーメッセージを追加できますか?そしておそらく実行可能なreproへのリンク? –

+0

私は質問にエラーを含めました。実行可能なレプロを作成しようとしますが、その間にどのようなデバイスがありますか?私はどのような形式を再現しようとするのかを教えてあげます。 –

+0

私は6sを持っています - それは働くでしょうか? –

答えて

0

解決策は、セッションに追加する前にAVCaptureDeviceを設定することが判明しました。代わりに:

session.addInput(try! AVCaptureDeviceInput(device: device)) 
output = AVCaptureMovieFileOutput() 
session.addOutput(output) 
device.setFormatWithHighestIso() 

あなたが行う必要があります。デバイスがセッションに追加された場合

device.setFormatWithHighestIso() // Do this first! 
session.addInput(try! AVCaptureDeviceInput(device: device)) 
output = AVCaptureMovieFileOutput() 
session.addOutput(output) 

、AVCaptureConnectionは、特定の方法で作成され、構成されています。後でデバイスの解像度を変更すると、設定が一致しなくなるため、接続が無効になり、ビデオは記録されません。

関連する問題