Video is not getting saved + Appending pixel buffer to adapter returns false , both is very rare and random

562 views Asked by At

I am writing a video to photo library / document directory using capture session and AVAssetWriter. What I want to know when I append pixel buffer to the adapter I do get false here print("video is (bobo)")same with audio. This doesn't save my output file and I do get an error on export and saving. I am working on it from so long any suggestions or mistake would help me a lot. Main problem is this issue is very random lets say 1 in 10 times but it do persist and I want to eliminate this issue.

My code where I am appending pixel buffer to adapter

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)")
            }
        }
    }
}

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

Code where I am setting asset writer

{

                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

            }

And to export the file to a video I am using this code.

 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

There are 0 answers