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を使用しますが、ビデオを正常に記録します。
このエラーメッセージについて他の質問がありますが、特にプリセットを使用せずにビデオをキャプチャする必要があるので、このエラーメッセージの欺瞞ではありません。
私はこれを試してみたいが、7+がない - 他のモデルに類似のエラーはない?エラーメッセージを追加できますか?そしておそらく実行可能なreproへのリンク? –
私は質問にエラーを含めました。実行可能なレプロを作成しようとしますが、その間にどのようなデバイスがありますか?私はどのような形式を再現しようとするのかを教えてあげます。 –
私は6sを持っています - それは働くでしょうか? –