视频未保存+向适配器添加像素缓冲区返回false,两者都非常罕见且随机

时间:2016-12-22 15:16:14

标签: ios swift3 avfoundation avcapturesession avassetwriter

我正在使用捕获会话和AVAssetWriter将视频写入照片库/文档目录。当我将像素缓冲区附加到适配器时我想知道的是我在这里得到假的打印("视频是(bobo)")与音频相同。 这不会保存我的输出文件,我确实在导出和保存时出错。 我正在研究它,因为任何建议或错误都会对我有所帮助。 主要问题是这个问题非常随机,可以说是十分之一,但确实存在,我想消除这个问题。

我将代码缓冲区附加到适配器的代码

func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!)
{

    starTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer)

    if captureOutput == videoOutput
    {


        if self.record == true{
            let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)

            if self.record == true
            {
                if self.writerInput.isReadyForMoreMediaData
                {
                    DispatchQueue(label: "newQeueLocalFeedVideo2", attributes: DispatchQueue.Attributes.concurrent).sync(execute: {
                        starTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer)
                                    let bobo = self.adapter.append(pixelBuffer!, withPresentationTime: self.starTime)
                                    print("video is \(bobo)")
                    })
                }
            }
        }

    }else if captureOutput == audioOutput{

        if self.record == true
        {
            if audioWriterInput.isReadyForMoreMediaData
            {
                let bo = audioWriterInput.append(sampleBuffer)
                print("audio conversion is \(bo)")
            }
        }
    }
}

/ ***** ------ ****** /

我正在设置资产编写者的代码

{

                let fileUrl = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("\(getCurrentDate())-capturedvideo.mp4")

                lastPath = fileUrl.path
                videoWriter = try? AVAssetWriter(outputURL: fileUrl, fileType: AVFileTypeMPEG4)
                lastPathURL = fileUrl


                let outputSettings = [AVVideoCodecKey : AVVideoCodecH264, AVVideoWidthKey : NSNumber(value: Float(outputSize.width) as Float), AVVideoHeightKey : NSNumber(value: Float(outputSize.height) as Float)] as [String : Any]

                writerInput = AVAssetWriterInput(mediaType: AVMediaTypeVideo, outputSettings: outputSettings)
                writerInput.expectsMediaDataInRealTime = true
                //                writerInput.performsMultiPassEncodingIfSupported = true
                audioWriterInput = AVAssetWriterInput(mediaType: AVMediaTypeAudio, outputSettings: DejalActivityView.getAudioDictionary() as? [String:AnyObject])

                videoWriter.add(writerInput)
                videoWriter.add(audioWriterInput)

                adapter = AVAssetWriterInputPixelBufferAdaptor(assetWriterInput: writerInput, sourcePixelBufferAttributes: DejalActivityView.getAdapterDictionary() as? [String:AnyObject])

                videoWriter.startWriting()
                videoWriter.startSession(atSourceTime: starTime)
                //self.client?.recordCaptureSession.captureSession.startRunning()

                record = true

            }

要将文件导出为视频我正在使用此代码。

 self.videoWriter.finishWriting { () -> Void in
            Thread.sleep(forTimeInterval: 1.0)

            if self.videoWriter.status == AVAssetWriterStatus.failed {
                print("oh noes, an error: \(self.videoWriter.error.debugDescription)")
                completionHandler(true)

            } else {
                let content = FileManager.default.contents(atPath: self.lastPathURL.path)
                print("wrote video: \(self.lastPathURL.path) at size: \(content?.count)")

                // This below line will save the video to photo library
                HEPhotoLibraryHelper.saveVideosToPhotoLibrary(self.lastPathURL, withCompletionBlock: { (result) in

                    if result == true
                    {
                        do
                        {
                            try HEDocDirectory.shared.fileManagerDefault .removeItem(atPath: self.lastPath)
                        }catch let err as  NSError
                        {
                            print("Error in removing file from doc dir \(err.localizedDescription)")
                        }
                    }
                })

            }
        }

0 个答案:

没有答案