首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >avassetwriter startWriting()崩溃

avassetwriter startWriting()崩溃
EN

Stack Overflow用户
提问于 2016-03-22 19:50:09
回答 1查看 1.5K关注 0票数 2

我正在尝试制作ios记录器应用程序,但有时(真的很少见)我会出现奇怪的崩溃

代码语言:javascript
复制
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()方法上停止。我得到的错误是:

代码语言:javascript
复制
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[AVAssetWriterFailedTerminalHelper initWithConfigurationState:terminalError:] invalid parameter not satisfying: terminalError != ((void *)0)'

编辑:下面您可以看到设置AssetWriter代码:

代码语言:javascript
复制
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 }
}
EN

回答 1

Stack Overflow用户

发布于 2018-04-13 20:21:58

问题出在缓冲上。我不得不对视频/音频使用分离的并发队列:

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36153626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档