diff --git a/SwiftProject/SwiftProject/Project/Util/SpatialVideoConvertor.swift b/SwiftProject/SwiftProject/Project/Util/SpatialVideoConvertor.swift index 333578c..803f177 100644 --- a/SwiftProject/SwiftProject/Project/Util/SpatialVideoConvertor.swift +++ b/SwiftProject/SwiftProject/Project/Util/SpatialVideoConvertor.swift @@ -59,7 +59,6 @@ class SpatialVideoConvertor { ] ) assetReader.add(output_video) - //加载音频轨道 // let outputSettings_Audio:[String:Any] = [ // AVFormatIDKey:kAudioFormatLinearPCM, @@ -87,7 +86,14 @@ class SpatialVideoConvertor { track: asset.loadTracks(withMediaType: .audio).first!, outputSettings:outputSettings_Audio ) - assetReader.add(output_audio) + if assetReader.canAdd(output_audio){ + assetReader.add(output_audio) + print("添加音频read output成功。。。。") + } + else{ + print("添加音频read output失败。。。。") + } + // let output_audio = AVAssetReaderAudioMixOutput(audioTracks: asset.tracks(withMediaType: .audio), audioSettings: nil) @@ -156,6 +162,7 @@ class SpatialVideoConvertor { if vw == nil { vw = VideoWriter(url: outputFile, width: Int(cwidth), height: Int(cheight), orientation: orientation, sessionStartTime: CMTime(value: 1, timescale: 30 ), isRealTime: false, queue: .main) +// vw = VideoWriter(url: outputFile, width: Int(cwidth), height: Int(cheight), orientation: orientation, sessionStartTime: CMTimeMake(value: 0, timescale: 1), isRealTime: false, queue: .main) } _ = vw!.add(image: newpb!, presentationTime: time) print( "Added frame at \(time)") @@ -168,26 +175,18 @@ class SpatialVideoConvertor { } } - while let nextAudioBuffer = output_audio.copyNextSampleBuffer() { - print("audio read buffer....") - vw!.addAudio(sample: nextAudioBuffer) - } + +// let vw2 = vw! +// await vw!.addAudio(assetTrackOutput: output_audio){ +// _ = try! await vw2.finish() +// } print( "status - \(assetReader.status)") print( "status - \(assetReader.error?.localizedDescription ?? "None")") print( "Finished") - -// DispatchQueue.main.asyncAfter(deadline: .now() + 2) { -// DispatchQueue.main.sync { -// try await vw!.finish() -// } -// } - - - - -// _ = try await vw!.finish() + + _ = try await vw!.finish() } diff --git a/SwiftProject/SwiftProject/Project/Util/VideoWriter.swift b/SwiftProject/SwiftProject/Project/Util/VideoWriter.swift index 594e7fe..6888a47 100644 --- a/SwiftProject/SwiftProject/Project/Util/VideoWriter.swift +++ b/SwiftProject/SwiftProject/Project/Util/VideoWriter.swift @@ -74,8 +74,10 @@ class VideoWriter { // self.writerInput_Audio = AVAssetWriterInput(mediaType: AVMediaType.audio, outputSettings: outputSettings_Audio) // let outputSettings_Audio = AVOutputSettingsAssistant.init(preset: .preset1920x1080)?.audioSettings - self.writerInput_Audio = AVAssetWriterInput.init(mediaType: .audio, outputSettings: outputSettings_Audio, sourceFormatHint: nil) + self.writerInput_Audio = AVAssetWriterInput.init(mediaType: .audio, outputSettings: outputSettings_Audio) + self.writerInput_Audio.expectsMediaDataInRealTime = false +// self.writerInput_Audio. if writer.canAdd(self.writerInput_Audio) { writer.add(self.writerInput_Audio) print("writer 添加input audio成功...") @@ -96,36 +98,37 @@ class VideoWriter { self.writer = writer self.writerInput = input } - //追加音频 - func addAudio(sample:CMSampleBuffer) { - let formatDesc:CMFormatDescription = // 1 - CMSampleBufferGetFormatDescription(sample)!; - let mediaType:CMMediaType = CMFormatDescriptionGetMediaType(formatDesc); - if mediaType == kCMMediaType_Audio { - if self.writerInput_Audio.isReadyForMoreMediaData { - if self.writerInput_Audio.append(sample) == false { - print("追加音频失败....") - } - else{ - print("audio 追加成功....") - } - } - else { - print("auiod 追加还未准备好...") - self.writerInput_Audio.requestMediaDataWhenReady(on: DispatchQueue.main) { - if self.writerInput_Audio.append(sample) == false { - print("追加音频失败....") + func addAudio(assetTrackOutput:AVAssetReaderTrackOutput,callback:@escaping @Sendable () async -> Void) async { +// self.writerInput_Audio.requestMediaDataWhenReady(on: DispatchQueue.main) { + while let sample = assetTrackOutput.copyNextSampleBuffer() { + print("audio read buffer....") + let formatDesc:CMFormatDescription = CMSampleBufferGetFormatDescription(sample)! + let mediaType:CMMediaType = CMFormatDescriptionGetMediaType(formatDesc); + if mediaType == kCMMediaType_Audio { + if self.writerInput_Audio.isReadyForMoreMediaData { + if self.writerInput_Audio.append(sample) == false { + print("追加音频失败....:\(String(describing: self.writer.error?.localizedDescription))") + } + else{ + print("audio 追加成功....") + } } - else{ - print("audio 追加成功....") + else { + print("audio 追加还未准备好...") + } } + else { + print("不是audio类型...") + } + try! await Task.sleep(nanoseconds: 200_000_000) } - } - else { - print("不是audio类型...") - } + +// } + print("audio读取完毕。。。。") + await callback() + print("audio func 执行完毕。。。。...") } func add(image: CIImage, presentationTime: CMTime) -> Bool { @@ -164,8 +167,12 @@ class VideoWriter { } func finish() async throws -> AVAsset? { + print("开始调用finish...") +// return nil + writerInput_Audio.markAsFinished() writerInput.markAsFinished() print("VideoWriter: calling writer.finishWriting()") + await writer.finishWriting() if self.writer.status != .completed { print("VideoWriter finish: error in finishWriting - \(self.writer.error?.localizedDescription ?? "Unknown")")