8

を使用して、AVFoundation を使用して、デバイスのカメラからムービー ファイルに記録していますAVCaptureMovieFileOutputAVCaptureDeviceFormat録画を開始する前にユーザーが高フレーム レート モードと高解像度モードを切り替えられるようにしたいのですが、どちらがビデオ録画に適した最高の解像度をもたらすかを知る方法がわかりません。

たとえば、私がテストしている iPod touch では、リア カメラの次のデバイス フォーマットが一覧表示されます。

<AVCaptureDeviceFormat: 0x13108e260 'vide'/'420v'  192x 144, { 2- 30 fps}, HRSI:3264x2448, fov:54.267, max zoom:153.00 (upscales @17.00), AF System:1, ISO:24.0-768.0, SS:0.000024-0.500000>
<AVCaptureDeviceFormat: 0x1310911a0 'vide'/'420f'  192x 144, { 2- 30 fps}, HRSI:3264x2448, fov:54.267, max zoom:153.00 (upscales @17.00), AF System:1, ISO:24.0-768.0, SS:0.000024-0.500000>
<AVCaptureDeviceFormat: 0x1310afa60 'vide'/'420v'  352x 288, { 2- 30 fps}, HRSI:2992x2448, fov:49.745, max zoom:153.00 (upscales @8.50), AF System:1, ISO:24.0-768.0, SS:0.000024-0.500000>
<AVCaptureDeviceFormat: 0x1310af9b0 'vide'/'420f'  352x 288, { 2- 30 fps}, HRSI:2992x2448, fov:49.745, max zoom:153.00 (upscales @8.50), AF System:1, ISO:24.0-768.0, SS:0.000024-0.500000>
<AVCaptureDeviceFormat: 0x131092ad0 'vide'/'420v'  480x 360, { 2- 30 fps}, HRSI:3264x2448, fov:54.267, max zoom:153.00 (upscales @6.80), AF System:1, ISO:24.0-768.0, SS:0.000024-0.500000>
<AVCaptureDeviceFormat: 0x13108f1c0 'vide'/'420f'  480x 360, { 2- 30 fps}, HRSI:3264x2448, fov:54.267, max zoom:153.00 (upscales @6.80), AF System:1, ISO:24.0-768.0, SS:0.000024-0.500000>
<AVCaptureDeviceFormat: 0x1310af300 'vide'/'420v'  640x 480, { 2- 30 fps}, HRSI:3264x2448, fov:54.267, max zoom:153.00 (upscales @5.10), AF System:1, ISO:24.0-768.0, SS:0.000024-0.500000>
<AVCaptureDeviceFormat: 0x131021990 'vide'/'420f'  640x 480, { 2- 30 fps}, HRSI:3264x2448, fov:54.267, max zoom:153.00 (upscales @5.10), AF System:1, ISO:24.0-768.0, SS:0.000024-0.500000>
<AVCaptureDeviceFormat: 0x1310ac0f0 'vide'/'420v'  960x 540, { 2- 30 fps}, HRSI:3264x1836, fov:54.267, supports vis, max zoom:104.38 (upscales @3.09), AF System:1, ISO:24.0-768.0, SS:0.000024-0.500000>
<AVCaptureDeviceFormat: 0x1310ac180 'vide'/'420f'  960x 540, { 2- 30 fps}, HRSI:3264x1836, fov:54.267, supports vis, max zoom:104.38 (upscales @3.09), AF System:1, ISO:24.0-768.0, SS:0.000024-0.500000>
<AVCaptureDeviceFormat: 0x131091550 'vide'/'420v' 1280x 720, { 2- 30 fps}, HRSI:3264x1836, fov:54.267, supports vis, max zoom:95.62 (upscales @2.32), AF System:1, ISO:24.0-768.0, SS:0.000024-0.500000>
<AVCaptureDeviceFormat: 0x1310ab800 'vide'/'420f' 1280x 720, { 2- 30 fps}, HRSI:3264x1836, fov:54.267, supports vis, max zoom:95.62 (upscales @2.32), AF System:1, ISO:24.0-768.0, SS:0.000024-0.500000>
<AVCaptureDeviceFormat: 0x13100a350 'vide'/'420v' 1280x 720, { 3-120 fps}, fov:54.267, binned, supports vis, max zoom:52.12 (upscales @1.16), AF System:1, ISO:24.0-768.0, SS:0.000025-0.333333>
<AVCaptureDeviceFormat: 0x131090270 'vide'/'420f' 1280x 720, { 3-120 fps}, fov:54.267, binned, supports vis, max zoom:52.12 (upscales @1.16), AF System:1, ISO:24.0-768.0, SS:0.000025-0.333333>
<AVCaptureDeviceFormat: 0x131021510 'vide'/'420v' 1920x1080, { 2- 30 fps}, HRSI:3264x1836, fov:54.267, supports vis, max zoom:95.62 (upscales @1.55), AF System:1, ISO:24.0-768.0, SS:0.000024-0.500000>
<AVCaptureDeviceFormat: 0x1310a2130 'vide'/'420f' 1920x1080, { 2- 30 fps}, HRSI:3264x1836, fov:54.267, supports vis, max zoom:95.62 (upscales @1.55), AF System:1, ISO:24.0-768.0, SS:0.000024-0.500000>
<AVCaptureDeviceFormat: 0x12fe17b90 'vide'/'420v' 2592x1936, { 2- 30 fps}, HRSI:3264x2448, fov:54.267, max zoom:153.00 (upscales @1.26), AF System:1, ISO:24.0-768.0, SS:0.000024-0.500000>
<AVCaptureDeviceFormat: 0x13108e010 'vide'/'420f' 2592x1936, { 2- 30 fps}, HRSI:3264x2448, fov:54.267, max zoom:153.00 (upscales @1.26), AF System:1, ISO:24.0-768.0, SS:0.000024-0.500000>
<AVCaptureDeviceFormat: 0x12fe17be0 'vide'/'420v' 3264x2448, { 2- 30 fps}, fov:54.267, max zoom:153.00 (upscales @1.00), AF System:1, ISO:24.0-768.0, SS:0.000024-0.500000>
<AVCaptureDeviceFormat: 0x12fe17c40 'vide'/'420f' 3264x2448, { 2- 30 fps}, fov:54.267, max zoom:153.00 (upscales @1.00), AF System:1, ISO:24.0-768.0, SS:0.000024-0.500000>

最高のフレーム レートを選択するのは簡単です (ドキュメントに例が示されています)。フォーマットとサポートされているフレーム レート範囲を反復処理して、フレーム レートが最も高いものを見つけるだけです。私が知る限り、最高のフレーム レートのフォーマットは、常にビデオ ファイルへの記録に使用できます。

最高解像度のフォーマットを見つけようとすると、問題が発生します。この場合、1080p が記録可能な最高値ですが、フォーマットは 2448p までリストされています。カメラのハードウェアをこの形式に切り替えることはできますが、1080p を超えるファイルへの記録を拒否します。もちろん、1080p のみを使用するようにハードコーディングすることもできますが、現在、4K での録画をサポートするデバイスがあります。

私の質問は、このリストをフィルタリングして、記録に適した形式のみを表示するにはどうすればよいですか? AVCaptureDeviceFormatとのドキュメントを調べましたがCMFormatDescription、指定された形式が記録可能かどうかを示すものは見つかりません。この質問は似ていますが、trueになるまでフォーマットを常に切り替えるのisActiveは悪い方法のようです。

どれが機能するかを確認するためにすべてを試すことなく、使用する正しい形式を見つけることができますか?

4

1 に答える 1

4

ほとんどの場合AVCaptureSession.sessionPreset、いずれかに設定するAVCaptureSessionPreset...だけで十分です。canSetSessionPreset(preset:)プリセットが現在のデバイスでサポートされているかどうかを確認するために使用します。

可能な限り最高の解像度 (幅) を取得したかったのです。フレームレートなどに関係なく、これが私の解決策です:

captureSession.sessionPreset = AVCaptureSessionPresetInputPriority // Required for the "activeFormat" of the device to be used
let highresFormat = (device.formats as! [AVCaptureDeviceFormat])
    .filter { CMFormatDescriptionGetMediaSubType($0.formatDescription) == 875704422 } // Full range 420f
    .maxElement { a, b in CMVideoFormatDescriptionGetDimensions(a.formatDescription).width < CMVideoFormatDescriptionGetDimensions(b.formatDescription).width }
if let format = highresFormat {
    device.activeFormat = format
}

確かに、「420 f」(「420 v」ではなく)バリアントを取得するのは少し奇妙です...

すべてのデバイスは異なる形式を返すためAVCaptureDevice.formats、返された形式は現在のデバイスで機能すると思います。一部の情報は、Appleのこのテクニカル ノートに記載されています。

于 2016-02-24T16:33:03.700 に答える