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

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)
//
// let outputSettings_Audio:[String:Any] = [
// AVFormatIDKey:kAudioFormatLinearPCM,
@ -87,7 +86,14 @@ class SpatialVideoConvertor {
track: asset.loadTracks(withMediaType: .audio).first!,
outputSettings:outputSettings_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()
}

View File

@ -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)!;
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("追加音频失败....")
print("追加音频失败....:\(String(describing: self.writer.error?.localizedDescription))")
}
else{
print("audio 追加成功....")
}
}
else {
print("auiod 追加还未准备好...")
self.writerInput_Audio.requestMediaDataWhenReady(on: DispatchQueue.main) {
if self.writerInput_Audio.append(sample) == false {
print("追加音频失败....")
}
else{
print("audio 追加成功....")
}
}
print("audio 追加还未准备好...")
}
}
else {
print("不是audio类型...")
}
try! await Task.sleep(nanoseconds: 200_000_000)
}
// }
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")")