Photos と AVFoundationどちらが良いかな?
と
他用途で撮影するだけならPhotosでも良いようですね
今回はゴリゴリで作りたいのでAVFoundationで
特徴 | Photos + UIImagePickerController | AVFoundation |
簡単さ | 簡単(シンプルなアプリ向け) | 難しい(コード量が多い) |
カスタマイズ性 | 低い | 高い |
高度な機能(リアルタイム) | 不可 | 可能 |
学習コスト | 低い | 高い |
Info.plistに追加が必要なのは?
<key>NSCameraUsageDescription</key> <string>このアプリは写真を撮影するためにカメラを使用します。</string> <key>NSPhotoLibraryAddUsageDescription</key> <string>撮影した写真をアルバムに保存するためにフォトライブラリにアクセスします。</string> <key>NSPhotoLibraryUsageDescription</key> <string>写真を選択または編集するためにフォトライブラリにアクセスします。</string>
こんな感じで Info.plistに追加
多言語化したいので 日本語と英語
多言語化する
Project を開いて Infoのところで Localizations
+ Japanese ( ja )を追加
new file ファイル追加で String Catalog を選択
Localizableで作成
English と Japaneseがある状態
+で追加してEnglishとJapaneseを設定
こんにちわーるどを呼び出すには?
let helloString = NSLocalizedString("HelloWorld", comment: "")
という感じで。
Info.plistの説明文などを多言語化する
InfoPlist.stringsファイルの作成:
- Xcodeのプロジェクトナビゲータで、プロジェクトのGroupを右クリックし、「New File」から「Strings File(Legacy)」を選択します。
- ファイル名を「InfoPlist.strings」とします。
InfoPlistを選択して 右の Localization から
EnglishとJapaneseをチェック
こんな感じ
InfoPlist(English)
NSCameraUsageDescription = "This app requires access to the camera to take photos."
InfoPlist(Japanese)
NSCameraUsageDescription = "このアプリは写真を撮影するためにカメラを使用します。"
としました。
元のInfoの Privacy Camera Usage Descriptionのところは空欄にしました!
無事説明が出ました!
これだけで、カメラ起動と撮影はOKです^^
動画撮影は、音声録音も必要なので
NSMicrophoneUsageDescription も必要でした。
取得できるカメラデータ
データ項目 | メソッドまたはプロパティ | 説明 |
使用可能なデバイス一覧 | AVCaptureDevice.DiscoverySession | 利用可能なカメラデバイス一覧を取得。 |
解像度とフォーマット | AVCaptureDevice.formats | サポートする解像度やフォーマットを取得。 |
フォーカスモード | AVCaptureDevice.focusMode | 現在のフォーカスモード。 |
露出モード | AVCaptureDevice.exposureMode | 現在の露出モード。 |
ズーム倍率 | AVCaptureDevice.videoZoomFactor | 現在のズーム倍率。 |
トーチとフラッシュの状態 | AVCaptureDevice.isTorchAvailable, hasFlash | トーチとフラッシュの有無。 |
カメラの接続状態 | 通知 (AVCaptureDeviceWasConnected) | カメラが接続・切断された通知。 |
とりあえず全部見てみた
Device Name: 背面カメラ Position: 1 Device Type: AVCaptureDeviceTypeBuiltInWideAngleCamera Device Name: 前面カメラ Position: 2 Device Type: AVCaptureDeviceTypeBuiltInWideAngleCamera Format: <AVCaptureDeviceFormat: 0x281a00320 'vide'/'420v' 192x 144, { 3- 60 fps}, photo dims:{192x144,4032x3024}, fov:63.301, max zoom:189.00 (upscales @21.00), AF System:2, ISO:22.0-1760.0, SS:0.000020-0.333333> Resolution: 192x144 Max Frame Rate: 60.0 Format: <AVCaptureDeviceFormat: 0x281a02d60 'vide'/'420f' 192x 144, { 3- 60 fps}, photo dims:{192x144,4032x3024}, fov:63.301, max zoom:189.00 (upscales @21.00), AF System:2, ISO:22.0-1760.0, SS:0.000020-0.333333, supports wide color> // 中略 Format: <AVCaptureDeviceFormat: 0x281a03420 'vide'/'420f' 4032x3024, { 3- 30 fps}, photo dims:{4032x3024}, fov:63.301, max zoom:189.00 (upscales @1.00), AF System:2, ISO:22.0-2112.0, SS:0.000020-0.333333, supports wide color, supports highest photo quality> Resolution: 4032x3024 Max Frame Rate: 30.0 Focus Mode: 2 Exposure Mode: 2 White Balance Mode: 2 Current Zoom Factor: 1.0 Max Zoom Factor: 16.0 Torch Available: true Flash Available: true
縦横比率 – sessionPreset
High Definition
qHD960x540: AVCaptureSession.Preset
hd1280x720: AVCaptureSession.Preset
hd1920x1080: AVCaptureSession.Preset
hd4K3840x2160: AVCaptureSession.Preset
VGA ( 4:3 レトロ感ありそう◯
qvga320x240: AVCaptureSession.Preset
vga640x480: AVCaptureSession.Preset
とりあえずこの辺を使おうかな?1200万画素のカメラがあればとりあえず、4K行けるので
表示は、AVCaptureVideoPreviewLayerで表示してそのサイズを同じ比率にすることで◎対応できました^^
しかし!フィルター適用でまた表示を変更。まあ良いのですが。
swiftUIの話。 StateObject x ObserveObject or Binding
正確な理解はなんとも親viewと子viewの変数(オブジェクト)の受け渡しで、
- Binding 同期!子viewからの反映が必要か。英語でいうと拘束力ということで結びつきが強いイメージですね
- ObesrveObject 観察対象、親viewの変更を子viewで観察して反映できるということ
のようですね。
EnvironmentObjectも良いですね、使っていると少しずつイメージが見えてきました?
画像の回転が難しい話。
swiftで画像の向きがおかしいと検索するとたくさん出てきます。
そしてよくわかりません>_<;
固定できればとりあえず良いのですが。
一気にやろうとしているので
写真撮影と動画撮影、動画プレビュー、動画からのフレーム切り出し
まあ写真撮影だけおかしい感じですが、回転は保存後に修正してください…と
今、縦横は長さでわかりますが、スクエアを採用すると…どっちがどっちかわからない。。。ん?困った。けど仕方ないか
そして前面カメラと背面カメラ
動画プレビュー AVCaptureVideoPreviewLayer でよいのか?
通常表示は AVCaptureVideoPreviewLayer で良いのですが
フィルターをかけたりすると使用できないので ImageViewに生成した画像を表示していきました。
ホワイトバランス
gainでホワイトバランスを設定。
その設定の 色温度と tint を取得できる
ホワイトバランスの設定だけでもある程度のベース色調整ができるので 動画のベースを検討
.photo / フラッシュ / キャプチャ
フラッシュにすると写真撮影が出来なくて(動画フレーム保存はもちろんできるがフラッシュは関係ない)
.on .auto のとき権限はカメラと同じなので
モードが .photoじゃないとだめと
.photoだと解像度がカメラ依存 ( 1200万画素あれば 4032×3024 )なので3840×2180 で4K切り抜きも可能
インカメラだと 500万画素?の6sでも2576 x 1932なのでまあまあかな
700万画素で 3088 x 2320
iPhone11からは1200万画素のようなので4K撮れるのかな
サイレントモードとして、フレームキャプチャは簡単だけど
コメント