diff --git a/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController.swift b/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController.swift index a3b3871..e46785f 100644 --- a/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController.swift +++ b/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController.swift @@ -611,21 +611,6 @@ class CCSpatialVideoDisplayController: BaseController, AVPlayerViewControllerDel } - //检查是否为空间视频 - func isSpatialVideo(asset: AVAsset) -> Bool { - let metadata = asset.metadata(forFormat: AVMetadataFormat.quickTimeMetadata) - let isSpatialVideo = metadata.contains { item in - if let identifier = item.identifier?.rawValue { - return identifier == "mdta/com.apple.quicktime.spatial.format-version" - } - return false - } - return isSpatialVideo - } - - - - //AVPlayerViewControllerDelegate - + } diff --git a/SwiftProject/SwiftProject/Project/Util/SpatialVideoConvertor.swift b/SwiftProject/SwiftProject/Project/Util/SpatialVideoConvertor.swift index 3c94e6f..3cf6a42 100644 --- a/SwiftProject/SwiftProject/Project/Util/SpatialVideoConvertor.swift +++ b/SwiftProject/SwiftProject/Project/Util/SpatialVideoConvertor.swift @@ -33,12 +33,6 @@ class SpatialVideoConvertor { let assetReader = try AVAssetReader(asset: asset) - //检查是否为空间视频 print("该视频不是空间视频或图片") - let userDataItems = try await asset.loadMetadata(for:.quickTimeMetadata) - let spacialCharacteristics = userDataItems.filter { $0.identifier?.rawValue == "mdta/com.apple.quicktime.spatial.format-version" } - if spacialCharacteristics.count == 0 { - print("不是空间视频") - } //获取输入视频的方向和大小(用于设置输出方向) let (orientation, videoSize) = try await getOrientationAndResolutionSizeForVideo(asset: asset) diff --git a/SwiftProject/SwiftProject/Project/Util/SpatialVideoWriter.swift b/SwiftProject/SwiftProject/Project/Util/SpatialVideoWriter.swift index 60424ff..e295240 100644 --- a/SwiftProject/SwiftProject/Project/Util/SpatialVideoWriter.swift +++ b/SwiftProject/SwiftProject/Project/Util/SpatialVideoWriter.swift @@ -52,6 +52,31 @@ class SpatialVideoWriter { input_video.expectsMediaDataInRealTime = true let adaptor_inputVideo = AVAssetWriterInputTaggedPixelBufferGroupAdaptor(assetWriterInput: input_video) assetWriter.add(input_video) + + + //附加视频标记元数据信息 + let metadataItem_1 = AVMutableMetadataItem() + metadataItem_1.identifier = .quickTimeMetadataDescription + metadataItem_1.dataType = kCMMetadataDataType_QuickTimeMetadataDirection as String + metadataItem_1.value = String("ff") as (NSCopying & NSObjectProtocol) + + + let metadataItem_2 = AVMutableMetadataItem() + metadataItem_2.identifier = .quickTimeMetadataInformation + metadataItem_2.dataType = kCMMetadataDataType_QuickTimeMetadataDirection as String + metadataItem_2.value = String("ff") as (NSCopying & NSObjectProtocol) + + + let atmg:AVMutableTimedMetadataGroup = AVMutableTimedMetadataGroup(items: [metadataItem_1,metadataItem_2], timeRange: CMTimeRange(start: .zero, duration: .positiveInfinity)) + let desc:CMMetadataFormatDescription? = atmg.copyFormatDescription() + let input_metadata = AVAssetWriterInput.init(mediaType: .metadata, outputSettings: nil, sourceFormatHint: desc) + let metadataAdaptor = AVAssetWriterInputMetadataAdaptor(assetWriterInput: input_metadata) + assetWriter.add(input_metadata) + + + + + // 创建音频输入 @@ -76,11 +101,12 @@ class SpatialVideoWriter { else { print("assetWriter 添加writerInput_Audio_left失败...") } - +// AVMetadataFormat assetWriter.startWriting() assetWriter.startSession(atSourceTime: .zero) + //创建视频读取 let leftEyeReader = try AVAssetReader(asset: leftEyeAsset) let rightEyeReader = try AVAssetReader(asset: rightEyeAsset) @@ -124,6 +150,9 @@ class SpatialVideoWriter { rightEyeReader.startReading() + + + while let leftBuffer = leftEyeOutput.copyNextSampleBuffer(), let rightBuffer = rightEyeOutput.copyNextSampleBuffer() { @@ -148,12 +177,18 @@ class SpatialVideoWriter { // 等待直到 writerInput 准备好接收下一个视频帧 Thread.sleep(forTimeInterval: 0.1) // 暂停一段时间,避免过度占用资源 } - adaptor_inputVideo.appendTaggedBuffers([left, right], withPresentationTime: leftBuffer.presentationTimeStamp) + let appendResult = adaptor_inputVideo.appendTaggedBuffers([left, right], withPresentationTime: leftBuffer.presentationTimeStamp) + print("appendResult :\(appendResult)") } self.addAudio(assetTrackOutput: output_audio_left, audio_input: writerInput_Audio_left) + //附加元素据 + let appendATMGResult = metadataAdaptor.append(atmg) + + print("atmg result:\(appendATMGResult)") + // 完成写入 print("完成写入") writerInput_Audio_left.markAsFinished() diff --git a/SwiftProject/SwiftProject/Project/Util/VideoConvertor2.swift b/SwiftProject/SwiftProject/Project/Util/VideoConvertor2.swift index d19fee6..d854191 100644 --- a/SwiftProject/SwiftProject/Project/Util/VideoConvertor2.swift +++ b/SwiftProject/SwiftProject/Project/Util/VideoConvertor2.swift @@ -78,12 +78,6 @@ class VideoConvertor2 { let assetReader = try AVAssetReader(asset: asset) - //检查是否为空间视频 print("该视频不是空间视频或图片") - let userDataItems = try await asset.loadMetadata(for:.quickTimeMetadata) - let spacialCharacteristics = userDataItems.filter { $0.identifier?.rawValue == "mdta/com.apple.quicktime.spatial.format-version" } - if spacialCharacteristics.count == 0 { - print("不是空间视频") - } //获取输入视频的方向和大小(用于设置输出方向) let (orientation, videoSize) = try await getOrientationAndResolutionSizeForVideo(asset: asset) diff --git a/SwiftProject/SwiftProject/Project/Util/ZZHHelper.swift b/SwiftProject/SwiftProject/Project/Util/ZZHHelper.swift index 4b42851..defa1a4 100644 --- a/SwiftProject/SwiftProject/Project/Util/ZZHHelper.swift +++ b/SwiftProject/SwiftProject/Project/Util/ZZHHelper.swift @@ -6,6 +6,7 @@ // import Foundation +import AVFoundation class ZZHHelper { @@ -33,4 +34,20 @@ class ZZHHelper { return "\(hoursText):\(minutesText):\(secondsText)" } } + + //MARK: 检查是否为空间视频 + class func isSpatialVideo(asset: AVAsset) -> Bool { + for track in asset.tracks { + if track.mediaType == .video { + for formatDesc in track.formatDescriptions { + let dic = CMFormatDescriptionGetExtensions(formatDesc as! CMFormatDescription) as! Dictionary + let fromatName = dic["FormatName"] as? String + if let fn = fromatName,fn == "HEVC"{ + return true + } + } + } + } + return false + } }