2017-12-19 4 views
0

모두에게 감사드립니다.AVAssetWriter가 startWriting 메서드를 호출 할 수 없습니다.

내 설정 AVAssetWriter 코드입니다. (- 12780), NSLocalizedDescription = "", NSUnderlyingError = 0x1c465a310 {오류 도메인 = NSOSStatusErrorDomain 코드 = -12780 "

그리고 오류

는 오류 도메인 = AVFoundationErrorDomain 코드 = -11800" "" "사용자 정보 = {NSLocalizedFailureReason =" "입니다 (널) "}}

private func createWriter(assetURL: URL) { 
    guard let assetWriter = try? AVAssetWriter.init(url: assetURL, fileType: AVFileType.mov) else { return } 
    ... 
    videoWriterInput = AVAssetWriterInput.init(mediaType: AVMediaType.video, outputSettings: outputSettings) 
    videoWriterInput?.expectsMediaDataInRealTime = true 
    videoWriterInput?.transform = videoWriterInput!.transform.rotated(by: CGFloat.pi/2) 
    audioWriterInput = AVAssetWriterInput.init(mediaType: AVMediaType.audio, outputSettings: nil) 
    audioWriterInput?.expectsMediaDataInRealTime = true 

    let SPBADictionary: [String: Any] = [kCVPixelBufferPixelFormatTypeKey as String: kCVPixelFormatType_32BGRA, 
             kCVPixelBufferWidthKey as String: kScreenWidth, 
             kCVPixelBufferHeightKey as String:kScreenHeight, 
             kCVPixelFormatOpenGLESCompatibility as String: kCFBooleanTrue] 
    assetWriterPixelBufferInput = AVAssetWriterInputPixelBufferAdaptor.init(assetWriterInput: videoWriterInput!, sourcePixelBufferAttributes: SPBADictionary) 

    assetWriter.shouldOptimizeForNetworkUse = true 
    if assetWriter.canAdd(videoWriterInput!) { 
     assetWriter.add(videoWriterInput!) 
    } 
    if assetWriter.canAdd(audioWriterInput!) { 
     assetWriter.add(audioWriterInput!) 
    } 

} 

그리고 이것은, 내가 충돌 있도록 startWriting에서, AVAssetWriterStatus, 쓰기 수 없습니다를 사용하지 않는 이유를 알고 나를 -11800 에러 제공하지 않습니다 콜백 코드, 알 수없는 오류 .

func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) { 
    if !isRecoding { return } 
    guard let assetWriter = assetWriter else { return } 
    autoreleasepool { 
     let currentSampleTime = CMSampleBufferGetOutputPresentationTimeStamp(sampleBuffer) 
     if assetWriter.status != .writing { 
      assetWriter.startWriting() 
      assetWriter.startSession(atSourceTime: currentSampleTime) 
     } 

     if assetWriter.status != .writing{ 
      print("Warning: writer status is \(assetWriter.status.rawValue)") 
      if assetWriter.status == AVAssetWriterStatus.failed { 
       print(assetWriter.error ?? "") 
       return 
      } 
     } 

     if output == videoOutput { 
      if let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer),videoWriterInput?.isReadyForMoreMediaData ?? false { 
       print("videoWriterInput") 
       assetWriterPixelBufferInput?.append(pixelBuffer, withPresentationTime: currentSampleTime) 
      } 
     } 
     if output == audioOutput { 
      if audioWriterInput?.isReadyForMoreMediaData ?? false { 
       print("audioWriterInput") 
       audioWriterInput?.append(sampleBuffer) 
      } 
     } 
    } 
} 
+0

오류 도메인 = AVFoundationErrorDomain 코드 = -11800 "" ""사용자 정보 = {NSLocalizedFailureReason = ""(- 12780), NSLocalizedDescription = "", NSUnderlyingError = 0x1c465a310 {오류 도메인 = NSOSStatusErrorDomain Code = -12780 "(null)"}} – Eggplant

+0

주석을 넣지 말고 질문에 넣으십시오. 그게'if assetWriter.status == AVAssetWriterStatus.failed'에서 얻은 오류입니까? – Larme

+0

예, 상태가 실패했지만 startWrtiting 메서드를 호출 할 수없는 이유를 알 수 없습니다. 코드는 모든 데모와 동일합니다. – Eggplant

답변

0

"startWriting()"이 실패하는 원인 중 하나는 지정된 URL이 유효하지 않다는 것입니다. 다음 주소를 참조하십시오.

  1. URL에 지정된 파일이 존재하지 않습니다. FileManager.fileExists(atPath:)으로 확인하십시오.
  2. 해당 URL의 모든 디렉토리에 이 생성되었습니다. (명시 적으로 FileManager.createDirectory(at:withIntermediateDirectories:attributes:)로를 만들 수 있습니다.)
관련 문제