20210724のiOSに関する記事は2件です。

[Unity]Live Photosを作成する

Unity の iOS 実機で Live Photos を作成する Unity の RenderTexture から Live Photos を作成する事ができました Unityからlive photosの保存できた! pic.twitter.com/2YUFStIUj2— ふじき (@fzkqi) July 23, 2021 リポジトリ リポジトリはこちら アセットの導入 Examples/UnityExample/Assets/Plugin/VideoCreator をコピーしてプロジェクトに取り込みます Live Photos を作成する Live Photos の実体は mov と jpeg ファイルです それぞれ同一の Content Identifier を設定する必要があります そこで、mov の作成の時に、uuidを生成し渡します string uuid = System.Guid.NewGuid().ToString(); string cachePath = "file://" + Application.temporaryCachePath + "/tmp.mov"; MediaCreator.InitAsMovWithAudio(cachePath, "h264", width, height, uuid); マイクロ秒で時刻を指定して、録画を開始します long startTimeOffset = 0; MediaCreator.Start(startTimeOffset); Texture を動画に書き込みます サンプルでは RenderTexture を利用しています Texture texture = Get Texture; long time = startTimeOffset + Elapsed time from Start; MediaCreator.WriteVideo(texture, time); 書き込みを終了します Live Photos には時間制限があるので注意です MediaCreator.FinishSync(); mov が指定されたパスに保存されているので、サムネイルに使う texture と動画と同じ uuid を指定して Live Photos を保存します MediaSaver.SaveLivePhotos(texture, uuid, cachePath); 終わりに Unity から見た時にシンプルなインタフェースで、Live Photos を作成させる事ができました Live Photos は時間の制限などありますが、iOS 固有の機能などで活用して行きたいです
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LivePhotosをmovとjpegから作る

LivePhotos を mov と jpeg から作る mov と jpeg を LivePhotos として保存できます 動画ファイルの時間や、mov と jepg にそれぞれメタデータの設定が必要です AVAssetWriter と CoreImage を使って、それぞれのメタデータを設定する事が可能です サンプルアプリ リポジトリはこちらです LivePhotos として保存できる条件 mov と jpeg に共通の content identifier を設定する必要があります mov を作成する AVAssetWriter の設定 ファイルのメタデータに content identifier を設定します assetWriter.metadata に設定します let assetWriter = try AVAssetWriter(outputURL: url, fileType: fileType) let item = AVMutableMetadataItem() item.key = AVMetadataKey.quickTimeMetadataKeyContentIdentifier as NSString item.keySpace = AVMetadataKeySpace.quickTimeMetadata item.value = contentIdentifier as NSString item.dataType = kCMMetadataBaseDataType_UTF8 as String assetWriter.metadata = [item] AVMetadataKey.quickTimeMetadataKeyContentIdentifier は "com.apple.quicktime.content.identifier" のようです メタデータトラックを作成して追加します let spec : NSDictionary = [ kCMMetadataFormatDescriptionMetadataSpecificationKey_Identifier: "mdta/com.apple.quicktime.still-image-time", kCMMetadataFormatDescriptionMetadataSpecificationKey_DataType: kCMMetadataBaseDataType_SInt8 ] var desc : CMFormatDescription? = nil CMMetadataFormatDescriptionCreateWithMetadataSpecifications(allocator: kCFAllocatorDefault, metadataType: kCMMetadataFormatType_Boxed, metadataSpecifications: [spec] as CFArray, formatDescriptionOut: &desc) let input = AVAssetWriterInput(mediaType: .metadata, outputSettings: nil, sourceFormatHint: desc) let adaptor = AVAssetWriterInputMetadataAdaptor(assetWriterInput: input) assetWriter.add(adaptor.assetWriterInput) 開始時刻と終了時刻と still image time のメタデータを書き込みます 録画中に書き込む必要があるようです let item = AVMutableMetadataItem() item.key = "com.apple.quicktime.still-image-time" as NSString item.keySpace = AVMetadataKeySpace.quickTimeMetadata item.value = 0 as NSNumber item.dataType = kCMMetadataBaseDataType_SInt8 as String let timeRange = CMTimeRange(start: startTime, end: latestTime) metadataAdaptor.append(AVTimedMetadataGroup(items: [item], timeRange: timeRange)) CoreImage を使った jpeg の Data の作成 jpeg は "17" のキーに content identifier を設定する必要があるようです CIImage.settingProperties を使って、プロパティを設定します CIContext.jpegRepresentation を使って、CIImage から jpeg の Data を取得します let ci: CIImage = ~~~~~ let context = CIContext() let properties: [CFString : Any] = [kCGImagePropertyMakerAppleDictionary: ["17": contentIdentifier]] let propertiedCi = ci.settingProperties(properties) let jpegData = context.jpegRepresentation(of: propertiedCi, colorSpace: CGColorSpace(name: CGColorSpace.sRGB)!, options: [:])! Live Photos の保存 PHPhotoLibrary を使って Live Photos として保存します mov を .pairedVideo として保存します try PHPhotoLibrary.shared().performChangesAndWait { let request = PHAssetCreationRequest.forAsset() request.addResource(with: .photo, data: jpegData, options: nil) let videoOptions = PHAssetResourceCreationOptions() videoOptions.shouldMoveFile = true request.addResource(with: .pairedVideo, fileURL: videoUrl, options: videoOptions) } おわりに Live Photosはなかなかドキュメントを見つけられず苦心しました PHPhotoLibrary のエラーも情報が落ちないので、AVCapturePhotoOutput の出力と見比べたり差し替えたりすることで、コンストラクタのオプションだと jpeg の設定で出来ていないことに気付いたり、など大変でした Live Photos は iOS 固有の機能なので活用して行きたいです
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む