[SwiftUI]Apple iOS Appでカメラアプリを利用する。【AVFoundation】

スポンサーリンク
[SwiftUI]Apple iOS Appでカメラアプリを利用する。【AVFoundation】 SwiftUI

Apple iOS AppでAVFoundationを利用する際のメモを残しています。

iPhoneカメラをアプリで利用についての概要となります。

1.AVCaptureSessionの設定
2.AVCaptureDeviceクラスを用いたデバイスの設定
3.入力・出力データの設定
4.カメラの取得している映像の表示
5.UIの設定
6.カメラと写真の利用許可
7.撮影ボタン押下時のアクション設定
8.撮影した画像の保存

AVFoundation

Work with audiovisual assets, control device cameras, process audio, and configure system audio interactions.
視聴覚アセットを操作し、デバイスのカメラを制御し、オーディオを処理し、システムのオーディオインタラクションを構成します。
スポンサーリンク

Overview

The AVFoundation framework combines six major technology areas that together encompass a wide range of tasks for capturing, processing, synthesizing, controlling, importing and exporting audiovisual media on Apple platforms.

AVFoundationフレームワークは、Appleプラットフォームでオーディオビジュアルメディアをキャプチャ、処理、合成、制御、インポート、およびエクスポートするための幅広いタスクを一緒に含む6つの主要なテクノロジー領域を組み合わせたものです。

CAMERAアプリをXcodeに実装する。

AVFoundation Capture

写真をキャプチャし、ビデオとオーディオを記録します。 内蔵カメラとマイクまたは外部キャプチャデバイスを構成します。

AVFoundation Captureを使うとカメラが使えるようになりそうです。

それでは詳細を見に行きます。

Cameras and Media Capture

Capture photos and record video and audio; configure built-in cameras and microphones or external capture devices.
写真をキャプチャし、ビデオとオーディオを記録します。 内蔵カメラとマイクまたは外部キャプチャデバイスを構成します。

Overview

The AVFoundation Capture subsystem provides a common high-level architecture for video, photo, and audio capture services in iOS and macOS. Use this system if you want to:

AVFoundation Captureサブシステムは、iOSおよびmacOSのビデオ、写真、およびオーディオキャプチャサービスに共通の高レベルアーキテクチャを提供します。 次の場合にこのシステムを使用します。

  • Build a custom camera UI to integrate shooting photos or videos into your app’s user experience.
  • カスタムカメラUIを構築して、写真や動画の撮影をアプリのユーザーエクスペリエンスに統合します。
  • Give users more direct control over photo and video capture, such as focus, exposure, and stabilization options.
  • フォーカス、露出、安定化オプションなど、写真やビデオのキャプチャをより直接的に制御できるようにします。
  • Produce different results than the system camera UI, such as RAW format photos, depth maps, or videos with custom timed metadata.
  • RAW形式の写真、深度マップ、カスタムのタイミングメタデータを使用したビデオなど、システムカメラのUIとは異なる結果を生成します。
  • Get live access to pixel or audio data streaming directly from a capture device.
  • キャプチャデバイスから直接、ピクセルまたはオーディオデータストリーミングへのライブアクセスを取得します。

Note 注意

To instead let the user capture media with the system camera UI within your app, see UIImagePickerController.

代わりに、ユーザーがアプリ内のシステムカメラUIを使用してメディアをキャプチャできるようにするには、UIImagePickerControllerを参照してください。

The main parts of the capture architecture are sessions, inputs, and outputs: Capture sessions connect one or more inputs to one or more outputs. Inputs are sources of media, including capture devices like the cameras and microphones built into an iOS device or Mac. Outputs acquire media from inputs to produce useful data, such as movie files written to disk or raw pixel buffers available for live processing.

キャプチャアーキテクチャの主要部分は、セッション、入力、および出力です。キャプチャセッションは、1つ以上の入力を1つ以上の出力に接続します。 入力は、iOSデバイスまたはMacに組み込まれているカメラやマイクなどのキャプチャデバイスを含むメディアのソースです。 出力は入力からメディアを取得して、ディスクに書き込まれたムービーファイルやライブ処理に使用できる生のピクセルバッファなどの有用なデータを生成します。

詳細は以下を参照する。

Capture setup | Apple Developer Documentation
Configure built-in cameras and microphones, and external capture devices, for media capture.

Requesting Authorization for Media Capture on iOS メディアキャプチャの許可を要求するiOS

写真、オーディオ、およびビデオをキャプチャして保存する許可を求めることにより、ユーザーのプライバシーを尊重します。

iOSでは、ユーザーは各アプリにカメラとマイクへのアクセスを明示的に許可する必要があります。アプリがキャプチャシステムを初めて使用する前に、iOSは、以下に示すように、アプリにカメラへのアクセスを許可するようにユーザーに求めるアラートを表示します。iOSは、このアラートに対するユーザーの応答を記憶しているため、キャプチャシステムを後で使用しても、アラートが再び表示されることはありません。ユーザーは、[設定]> [プライバシー]でアプリの権限設定を変更できます。

メディアをキャプチャする前にアプリに権限があることを確認するには、以下の手順に従います。

アプリのInfo.plistファイルを構成する

iOSでは、システムがカメラまたはマイクの許可を求めたときにユーザーに表示する静的メッセージをアプリが提供する必要があります。

  • アプリでデバイスカメラを使用している場合は、アプリのInfo.plistファイルにNSCameraUsageDescriptionキーを含めます。
  • アプリがデバイスのマイクを使用している場合は、アプリのInfo.plistファイルにNSMicrophoneUsageDescriptionキーを含めます。

キーごとに、アプリがメディアをキャプチャする必要がある理由をユーザーに説明するメッセージを提供します。これにより、ユーザーはアプリにアクセス許可を自信を持って付与できるようになります。

キャプチャの承認を確認して要求する

キャプチャセッションを設定する前に、必ずメソッドをテストしてください。ユーザーがキャプチャ権限をまだ付与または拒否していない場合、承認ステータスはです。この場合、このメソッドを使用して、iOSにユーザーにプロンプ​​トを表示するように指示します。AVCaptureDevice authorizationStatus(for:)AVAuthorizationStatus.notDeterminedrequestAccess(for:completionHandler:)

この方法は非同期です。iOSが権限アラートを表示している間、アプリは実行を継続します。ユーザーが応答すると、システムは完了ハンドラーを呼び出します。完了ハンドラーのsuccessパラメーターがtrueの場合、キャプチャー・セッションのセットアップと開始に進むことができます。requestAccess(for:completionHandler:)

キャプチャされたメディアを保存する前に認証を要求する

写真やビデオをキャプチャした後、それらをユーザーのフォトライブラリに保存することをお勧めします。写真ライブラリにアクセスするには、ユーザーの許可も必要です(カメラとマイクの許可とは別に)。許可を要求する方法とタイミングは、メディアの保存に使用する機能によって異なります。

  • ほとんどの写真およびビデオキャプチャワークフロー(ライブ写真およびRAW形式のキャプチャを含む)では、およびクラスを使用します。これらのクラスにはフォトライブラリへの読み取り/書き込みアクセスが必要なため、Info.plistのNSPhotoLibraryUsageDescriptionキーを使用して、アクセスを要求するときにユーザーにメッセージを提供する必要があります。詳細については、キャプチャした写真の保存を参照してください。PHPhotoLibraryPHAssetCreationRequest
  • アプリがムービーファイルをフォトライブラリに保存するだけでよい場合、この関数は。のより簡単な代替手段を提供します。この関数はライブラリへの書き込みアクセスのみを必要とするため、Info.plistのNSPhotoLibraryAddUsageDescriptionキーを使用して、フォトライブラリに保存する許可を求めるときにユーザーにメッセージを提供します。UISaveVideoAtPathToSavedPhotosAlbum(_:_:_:_:)PHPhotoLibrary

NSCameraUsageDescription

NSCameraUsageDescriptionString–iOS)は、アプリ(iMessageアプリを含む)がデバイスのカメラにアクセスする理由を説明します。システムがユーザーにアクセスを許可するように求めると、この文字列がアラートの一部として表示されます。

重要: ユーザーのプライバシーを保護するために、iOS 10.0以降にリンクされ、デバイスのカメラにアクセスするiOSアプリは、そうする意図を静的に宣言する必要があります。NSCameraUsageDescriptionキーをアプリのInfo.plistファイルに含め、このキーの目的の文字列を指定します。アプリが対応する目的文字列なしでデバイスのカメラにアクセスしようとすると、アプリは終了します。

このキーはiOS7.0以降でサポートされています。

Xcodeでは、info.polstファイルにこの定義を追加する。

プログラムへの追加は不要。

Cocoa Keys
Describes the keys for a bundle's Info.plist file.

“Privacy – Camera Usage Description”

写真を撮影するためにカメラを使用します。

Captureの対応

キャプチャセッションの設定

写真やビデオをキャプチャする前に、入力デバイス、出力メディア、プレビュービュー、および基本設定を構成します。

概要

これは、iOSおよびmacOSでのすべてのメディアキャプチャの基礎です。これは、OSキャプチャインフラストラクチャとキャプチャデバイスへのアプリの排他的アクセス、および入力デバイスからメディア出力へのデータのフローを管理します。入力と出力の間の接続をどのように構成するかによって、キャプチャセッションの機能が定義されます。たとえば、次の図は、iPhoneのバックカメラとマイクを使用して、写真と動画の両方をキャプチャし、カメラのプレビューを提供するキャプチャセッションを示しています。AVCaptureSession

詳細なキャプチャセッションアーキテクチャの例のブロック図:カメラとマイクの個別のAVCaptureDeviceInputオブジェクトは、AVCaptureSessionによって管理されるAVCaptureConnectionオブジェクトを介して、AVCapturePhotoOutput、AVCaptureMovieFileOutput、およびAVCaptureVideoPreviewLayerに接続します。

入力と出力をセッションに接続する

すべてのキャプチャセッションには、少なくとも1つのキャプチャ入力とキャプチャ出力が必要です。キャプチャ入力(サブクラス)はメディアソースです。通常、iOSデバイスまたはMacに組み込まれているカメラやマイクなどの録音デバイスです。キャプチャ出力(サブクラス)は、キャプチャ入力によって提供されるデータを使用して、画像やムービーファイルなどのメディアを生成します。AVCaptureInputAVCaptureOutput

ビデオ入力にカメラを使用するには(写真やムービーをキャプチャするため)、適切なを選択し、対応するを作成して、セッションに追加します。AVCaptureDeviceAVCaptureDeviceInput

コメント