修正判断视频是否为空间视频的逻辑
This commit is contained in:
parent
40c3a4747e
commit
a6aefd1a81
@ -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
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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<String, Any>
|
||||
let fromatName = dic["FormatName"] as? String
|
||||
if let fn = fromatName,fn == "HEVC"{
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user