gpt4 book ai didi

ios - avassetwriter startWriting()崩溃

转载 作者:行者123 更新时间:2023-12-01 16:24:34 26 4
gpt4 key购买 nike

我正在尝试制作ios记录器应用程序,但有时(非常罕见)我遇到了奇怪的崩溃

public func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!) {

guard CMSampleBufferDataIsReady(sampleBuffer) else { return }
if assetWriter == nil { return }

let lastSampleTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer)

if assetWriter.status == .Unknown {
if assetWriter.startWriting() {
assetWriter.startSessionAtSourceTime(lastSampleTime)
} else {
print("assetWriter.startWriting error")
return
}
}

guard assetWriter.status == .Writing else { return }

if captureOutput == videoOutput && videoInput.readyForMoreMediaData {

if !videoInput.appendSampleBuffer(sampleBuffer) {
print("Unable to write to video input")
}
} else if captureOutput == audioOutput && audioInput.readyForMoreMediaData {

if !audioInput.appendSampleBuffer(sampleBuffer) {
print("Unable to write to audio input")
}
}
}

该应用程序停止在assetWriter.startWriting()方法上。我得到的错误:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[AVAssetWriterFailedTerminalHelper initWithConfigurationState:terminalError:] invalid parameter not satisfying: terminalError != ((void *)0)'

编辑:在下面您可以看到安装AssetWriter代码:
private func initWriter(url: NSURL) throws {

do {
assetWriter = try AVAssetWriter(URL: url, fileType: AVFileTypeMPEG4)

let videoSettings = videoOutput.recommendedVideoSettingsForAssetWriterWithOutputFileType(AVFileTypeMPEG4) as! [String: AnyObject]

guard assetWriter.canApplyOutputSettings(videoSettings, forMediaType: AVMediaTypeVideo)
else {
throw NSError(domain: "com.conn.VideoKit", code: 0, userInfo: [NSLocalizedDescriptionKey: "Couldn't apply video output settings"])
}

videoInput = AVAssetWriterInput(mediaType: AVMediaTypeVideo, outputSettings: videoSettings)
videoInput.transform = CGAffineTransformIdentity
videoInput.transform = CGAffineTransformMakeRotation( CGFloat( 270 * M_PI ) / 180.0 )
videoInput.expectsMediaDataInRealTime = true

if assetWriter.canAddInput(videoInput) {
assetWriter.addInput(videoInput)
} else {
print("Cannot add video input to asset writer")
}

let audioSettings = audioOutput.recommendedAudioSettingsForAssetWriterWithOutputFileType(AVFileTypeMPEG4) as! [String: AnyObject]

guard assetWriter.canApplyOutputSettings(audioSettings, forMediaType: AVMediaTypeAudio)
else {
throw NSError(domain: "com.conn.VideoKit", code: 0, userInfo: [NSLocalizedDescriptionKey: "Couldn't apply audio output settings"])
}

audioInput = AVAssetWriterInput(mediaType: AVMediaTypeAudio, outputSettings: audioSettings)
audioInput.expectsMediaDataInRealTime = true
if assetWriter.canAddInput(audioInput) {
assetWriter.addInput(audioInput)
} else {
print("Cannot add audio input to asset writer")
}
} catch let error { throw error }
}

最佳答案

问题出在缓冲上。我必须对视频/音频使用单独的并发队列:

let videoConcurrentQueue = dispatch_queue_create("com.videoConcurrentQueue", DISPATCH_QUEUE_CONCURRENT)
let audioConcurrentQueue = dispatch_queue_create("com.audioConcurrentQueue", DISPATCH_QUEUE_CONCURRENT)
videoOutput.setSampleBufferDelegate(self, queue: videoConcurrentQueue)
audioOutput.setSampleBufferDelegate(self, queue: audioConcurrentQueue)

关于ios - avassetwriter startWriting()崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36153626/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com