From 55827d2fb038d6771816e9aecbe49b9738a267dc Mon Sep 17 00:00:00 2001 From: bluesea <307723040@qq.com> Date: Fri, 8 Mar 2024 18:35:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=88=E6=88=90=E9=9F=B3=E9=A2=91=E8=BF=98?= =?UTF-8?q?=E5=AD=98=E5=9C=A8=E4=BA=9B=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Project/Util/SpatialVideoConvertor.swift | 61 ++++++++++++++++-- .../Project/Util/VideoWriter.swift | 64 +++++++++++++++++++ .../Project/Util/ZZHAVExtension.swift | 1 - 3 files changed, 121 insertions(+), 5 deletions(-) diff --git a/SwiftProject/SwiftProject/Project/Util/SpatialVideoConvertor.swift b/SwiftProject/SwiftProject/Project/Util/SpatialVideoConvertor.swift index 4a04030..333578c 100644 --- a/SwiftProject/SwiftProject/Project/Util/SpatialVideoConvertor.swift +++ b/SwiftProject/SwiftProject/Project/Util/SpatialVideoConvertor.swift @@ -50,7 +50,7 @@ class SpatialVideoConvertor { //加载视频轨道 - let output = try await AVAssetReaderTrackOutput( + let output_video = try await AVAssetReaderTrackOutput( track: asset.loadTracks(withMediaType: .video).first!, outputSettings: [ AVVideoDecompressionPropertiesKey: [ @@ -58,12 +58,49 @@ class SpatialVideoConvertor { ], ] ) - assetReader.add(output) + assetReader.add(output_video) + + //加载音频轨道 +// let outputSettings_Audio:[String:Any] = [ +// AVFormatIDKey:kAudioFormatLinearPCM, +// AVLinearPCMIsBigEndianKey:false, +// AVLinearPCMIsFloatKey:false, +// AVLinearPCMBitDepthKey:16 +// ] +// let outputSettings_Audio = [ +// AVFormatIDKey: kAudioFormatLinearPCM, +// AVSampleRateKey: 44100, +// AVNumberOfChannelsKey: 2, +//// AVEncoderBitRateKey: 128000, +// AVLinearPCMIsBigEndianKey:false, +// AVLinearPCMIsFloatKey:false, +// AVLinearPCMBitDepthKey:16 +// ] as [String : Any] + + let outputSettings_Audio = [ + AVFormatIDKey: kAudioFormatLinearPCM, // 指定未压缩格式 + AVSampleRateKey: 44100, + AVNumberOfChannelsKey: 2, + ] + + let output_audio = try await AVAssetReaderTrackOutput( + track: asset.loadTracks(withMediaType: .audio).first!, + outputSettings:outputSettings_Audio + ) + assetReader.add(output_audio) + + +// let output_audio = AVAssetReaderAudioMixOutput(audioTracks: asset.tracks(withMediaType: .audio), audioSettings: nil) +// assetReader.add(output_audio) + + + assetReader.startReading() let duration = try await asset.load(.duration) - while let nextSampleBuffer = output.copyNextSampleBuffer() { + + while let nextSampleBuffer = output_video.copyNextSampleBuffer() { guard let taggedBuffers = nextSampleBuffer.taggedBuffers else { return } @@ -131,15 +168,31 @@ class SpatialVideoConvertor { } } + while let nextAudioBuffer = output_audio.copyNextSampleBuffer() { + print("audio read buffer....") + vw!.addAudio(sample: nextAudioBuffer) + } + print( "status - \(assetReader.status)") print( "status - \(assetReader.error?.localizedDescription ?? "None")") print( "Finished") - _ = try await vw!.finish() + +// DispatchQueue.main.asyncAfter(deadline: .now() + 2) { +// DispatchQueue.main.sync { +// try await vw!.finish() +// } +// } + + + + +// _ = try await vw!.finish() } + //获取ciimage的数据 diff --git a/SwiftProject/SwiftProject/Project/Util/VideoWriter.swift b/SwiftProject/SwiftProject/Project/Util/VideoWriter.swift index f12d90e..594e7fe 100644 --- a/SwiftProject/SwiftProject/Project/Util/VideoWriter.swift +++ b/SwiftProject/SwiftProject/Project/Util/VideoWriter.swift @@ -15,6 +15,7 @@ import CoreImage class VideoWriter { fileprivate var writer: AVAssetWriter fileprivate var writerInput: AVAssetWriterInput + fileprivate var writerInput_Audio:AVAssetWriterInput fileprivate var pixelBufferAdaptor: AVAssetWriterInputPixelBufferAdaptor fileprivate let queue: DispatchQueue static var ciContext = CIContext.init() // we reuse a single context for performance reasons @@ -51,6 +52,38 @@ class VideoWriter { let pixelBufferAdaptor = AVAssetWriterInputPixelBufferAdaptor.init(assetWriterInput: input, sourcePixelBufferAttributes: sourceBufferAttributes) self.pixelBufferAdaptor = pixelBufferAdaptor + + + // 创建音频输入 +// let outputSettings_Audio:[String:Any] = [ +// AVFormatIDKey:kAudioFormatLinearPCM, +// AVLinearPCMIsBigEndianKey:false, +// AVLinearPCMIsFloatKey:false, +// AVLinearPCMBitDepthKey:16, +// ] + + let outputSettings_Audio = [ + AVFormatIDKey: kAudioFormatLinearPCM, // 指定未压缩格式 + AVSampleRateKey: 44100, + AVNumberOfChannelsKey: 2, + AVLinearPCMIsBigEndianKey:true, + AVLinearPCMIsFloatKey:true, + AVLinearPCMBitDepthKey:32, + AVLinearPCMIsNonInterleaved:false, + ] as [String:Any] + +// 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.expectsMediaDataInRealTime = false + if writer.canAdd(self.writerInput_Audio) { + writer.add(self.writerInput_Audio) + print("writer 添加input audio成功...") + } + else { + print("writer 添加input audio失败...") + } + writer.add(input) writer.startWriting() writer.startSession(atSourceTime: sessionStartTime) @@ -64,6 +97,37 @@ class VideoWriter { 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("追加音频失败....") + } + else{ + print("audio 追加成功....") + } + } + } + } + else { + print("不是audio类型...") + } + } + func add(image: CIImage, presentationTime: CMTime) -> Bool { if self.writerInput.isReadyForMoreMediaData == false { return false diff --git a/SwiftProject/SwiftProject/Project/Util/ZZHAVExtension.swift b/SwiftProject/SwiftProject/Project/Util/ZZHAVExtension.swift index 896d207..d6d6bc2 100644 --- a/SwiftProject/SwiftProject/Project/Util/ZZHAVExtension.swift +++ b/SwiftProject/SwiftProject/Project/Util/ZZHAVExtension.swift @@ -48,7 +48,6 @@ extension CVPixelBuffer { CVPixelBufferLockBaseAddress(self, []) VideoWriter.ciContext.render(image, to: self) -// VideoWriter.ciContext.render(image, to: self, bounds: CGRectMake(0, 0, 2200, 1600), colorSpace: nil) CVPixelBufferUnlockBaseAddress(self, []) }