视频转换出现问题,现需要回退

This commit is contained in:
bluesea 2024-03-11 15:08:37 +08:00
parent 55827d2fb0
commit 44e71b472c
2 changed files with 49 additions and 43 deletions

View File

@ -59,7 +59,6 @@ class SpatialVideoConvertor {
] ]
) )
assetReader.add(output_video) assetReader.add(output_video)
// //
// let outputSettings_Audio:[String:Any] = [ // let outputSettings_Audio:[String:Any] = [
// AVFormatIDKey:kAudioFormatLinearPCM, // AVFormatIDKey:kAudioFormatLinearPCM,
@ -87,7 +86,14 @@ class SpatialVideoConvertor {
track: asset.loadTracks(withMediaType: .audio).first!, track: asset.loadTracks(withMediaType: .audio).first!,
outputSettings:outputSettings_Audio outputSettings:outputSettings_Audio
) )
if assetReader.canAdd(output_audio){
assetReader.add(output_audio) assetReader.add(output_audio)
print("添加音频read output成功。。。。")
}
else{
print("添加音频read output失败。。。。")
}
// let output_audio = AVAssetReaderAudioMixOutput(audioTracks: asset.tracks(withMediaType: .audio), audioSettings: nil) // let output_audio = AVAssetReaderAudioMixOutput(audioTracks: asset.tracks(withMediaType: .audio), audioSettings: nil)
@ -156,6 +162,7 @@ class SpatialVideoConvertor {
if vw == nil { 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: 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) _ = vw!.add(image: newpb!, presentationTime: time)
print( "Added frame at \(time)") print( "Added frame at \(time)")
@ -168,26 +175,18 @@ class SpatialVideoConvertor {
} }
} }
while let nextAudioBuffer = output_audio.copyNextSampleBuffer() {
print("audio read buffer....") // let vw2 = vw!
vw!.addAudio(sample: nextAudioBuffer) // await vw!.addAudio(assetTrackOutput: output_audio){
} // _ = try! await vw2.finish()
// }
print( "status - \(assetReader.status)") print( "status - \(assetReader.status)")
print( "status - \(assetReader.error?.localizedDescription ?? "None")") print( "status - \(assetReader.error?.localizedDescription ?? "None")")
print( "Finished") print( "Finished")
// DispatchQueue.main.asyncAfter(deadline: .now() + 2) { _ = try await vw!.finish()
// DispatchQueue.main.sync {
// try await vw!.finish()
// }
// }
// _ = try await vw!.finish()
} }

View File

@ -74,8 +74,10 @@ class VideoWriter {
// self.writerInput_Audio = AVAssetWriterInput(mediaType: AVMediaType.audio, outputSettings: outputSettings_Audio) // self.writerInput_Audio = AVAssetWriterInput(mediaType: AVMediaType.audio, outputSettings: outputSettings_Audio)
// let outputSettings_Audio = AVOutputSettingsAssistant.init(preset: .preset1920x1080)?.audioSettings // 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.expectsMediaDataInRealTime = false
// self.writerInput_Audio.
if writer.canAdd(self.writerInput_Audio) { if writer.canAdd(self.writerInput_Audio) {
writer.add(self.writerInput_Audio) writer.add(self.writerInput_Audio)
print("writer 添加input audio成功...") print("writer 添加input audio成功...")
@ -96,36 +98,37 @@ class VideoWriter {
self.writer = writer self.writer = writer
self.writerInput = input self.writerInput = input
} }
// //
func addAudio(sample:CMSampleBuffer) { func addAudio(assetTrackOutput:AVAssetReaderTrackOutput,callback:@escaping @Sendable () async -> Void) async {
let formatDesc:CMFormatDescription = // 1 // self.writerInput_Audio.requestMediaDataWhenReady(on: DispatchQueue.main) {
CMSampleBufferGetFormatDescription(sample)!; while let sample = assetTrackOutput.copyNextSampleBuffer() {
print("audio read buffer....")
let formatDesc:CMFormatDescription = CMSampleBufferGetFormatDescription(sample)!
let mediaType:CMMediaType = CMFormatDescriptionGetMediaType(formatDesc); let mediaType:CMMediaType = CMFormatDescriptionGetMediaType(formatDesc);
if mediaType == kCMMediaType_Audio { if mediaType == kCMMediaType_Audio {
if self.writerInput_Audio.isReadyForMoreMediaData { if self.writerInput_Audio.isReadyForMoreMediaData {
if self.writerInput_Audio.append(sample) == false { if self.writerInput_Audio.append(sample) == false {
print("追加音频失败....") print("追加音频失败....:\(String(describing: self.writer.error?.localizedDescription))")
} }
else{ else{
print("audio 追加成功....") print("audio 追加成功....")
} }
} }
else { else {
print("auiod 追加还未准备好...") print("audio 追加还未准备好...")
self.writerInput_Audio.requestMediaDataWhenReady(on: DispatchQueue.main) {
if self.writerInput_Audio.append(sample) == false {
print("追加音频失败....")
}
else{
print("audio 追加成功....")
}
}
} }
} }
else { else {
print("不是audio类型...") print("不是audio类型...")
} }
try! await Task.sleep(nanoseconds: 200_000_000)
}
// }
print("audio读取完毕。。。。")
await callback()
print("audio func 执行完毕。。。。...")
} }
func add(image: CIImage, presentationTime: CMTime) -> Bool { func add(image: CIImage, presentationTime: CMTime) -> Bool {
@ -164,8 +167,12 @@ class VideoWriter {
} }
func finish() async throws -> AVAsset? { func finish() async throws -> AVAsset? {
print("开始调用finish...")
// return nil
writerInput_Audio.markAsFinished()
writerInput.markAsFinished() writerInput.markAsFinished()
print("VideoWriter: calling writer.finishWriting()") print("VideoWriter: calling writer.finishWriting()")
await writer.finishWriting() await writer.finishWriting()
if self.writer.status != .completed { if self.writer.status != .completed {
print("VideoWriter finish: error in finishWriting - \(self.writer.error?.localizedDescription ?? "Unknown")") print("VideoWriter finish: error in finishWriting - \(self.writer.error?.localizedDescription ?? "Unknown")")