2017-12-20 4 views
0

셀프 비디오 저장 후 비디오 크기가 변경됩니다. 이 문제는 셀카 비디오를 찍을 때만 발생합니다.셀카 비디오 스위프트 저장 후 비디오 크기 변경 4

세로 방향과 가로 방향을 올바르게 지원하고 비디오 셀틱을 찍을 때 비디오 파일 출력에 올바르게 반영 되려면 어떻게해야합니까? 다음은 내가 작성한 전체 소스입니다 :

다음
// File to composit 
    let asset = AVURLAsset(url: videoURL as URL) 
    let composition = AVMutableComposition.init() 
    composition.addMutableTrack(withMediaType: AVMediaType.video, preferredTrackID: kCMPersistentTrackID_Invalid) 

    let clipVideoTrack = asset.tracks(withMediaType: AVMediaType.video)[0] 


    // Rotate to potrait 
    let transformer = AVMutableVideoCompositionLayerInstruction(assetTrack: clipVideoTrack) 

    var videoAssetOrientation_: UIImageOrientation = .up 
    var isVideoAssetPortrait_: Bool = false 

    let videoTransform:CGAffineTransform = clipVideoTrack.preferredTransform 



    if (videoTransform.a == 0.0 && videoTransform.b == 1.0 && videoTransform.c == -1.0 && videoTransform.d == 0) 
     || (videoTransform.a == 0.0 && videoTransform.b == -1.0 && videoTransform.c == 1.0 && videoTransform.d == 0) { 
     isVideoAssetPortrait_ = true 
    } 

    if videoTransform.a == 0 && videoTransform.b == 1.0 && videoTransform.c == -1.0 && videoTransform.d == 0 { 
     videoAssetOrientation_ = .right 
     isVideoAssetPortrait_ = true 
    } 
    if videoTransform.a == 0 && videoTransform.b == -1.0 && videoTransform.c == 1.0 && videoTransform.d == 0 { 
     videoAssetOrientation_ = .left 
     isVideoAssetPortrait_ = true 
    } 
    if videoTransform.a == 1.0 && videoTransform.b == 0 && videoTransform.c == 0 && videoTransform.d == 1.0 { 
     videoAssetOrientation_ = .up 
    } 
    if videoTransform.a == -1.0 && videoTransform.b == 0 && videoTransform.c == 0 && videoTransform.d == -1.0 { 
     videoAssetOrientation_ = .down 
    } 

    transformer.setTransform(clipVideoTrack.preferredTransform, at: kCMTimeZero) 

    var naturalSize = CGSize() 

    if isVideoAssetPortrait_ { 
     naturalSize = CGSize(width: clipVideoTrack.naturalSize.height, height: clipVideoTrack.naturalSize.width) 
    } else { 
     naturalSize = clipVideoTrack.naturalSize 
    } 

    var renderWidth: CGFloat! 
    var renderHeight: CGFloat! 

    renderWidth = naturalSize.width 
    renderHeight = naturalSize.height 

    let parentlayer = CALayer() 
    let videoLayer = CALayer() 
    let watermarkLayer = CALayer() 

    watermarkLayer.contents = tempImageView.image?.cgImage 
    watermarkLayer.opacity = 1.0 

    parentlayer.frame = CGRect(x: 0, y: 0, width: renderWidth, height: renderHeight) 
    videoLayer.frame = CGRect(x: 0, y: 0, width: renderWidth, height: renderHeight) 
    watermarkLayer.frame = CGRect(x: 0, y: 0 ,width: renderWidth, height: renderHeight) 

    parentlayer.addSublayer(videoLayer) 
    parentlayer.addSublayer(watermarkLayer) 

    let videoComposition = AVMutableVideoComposition() 
    videoComposition.renderSize = CGSize(width: renderWidth, height: renderHeight) 
    videoComposition.frameDuration = CMTimeMake(1, 30) 
    videoComposition.renderScale = 1.0 

    // Add watermark to video 
    videoComposition.animationTool = AVVideoCompositionCoreAnimationTool(postProcessingAsVideoLayers: [videoLayer], in: parentlayer) 

    let instruction = AVMutableVideoCompositionInstruction() 
    instruction.timeRange = CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(60, 30)) 


    instruction.layerInstructions = [transformer] 
    videoComposition.instructions = [instruction] 

내가 비디오 셀카를 찍을 때와 같은 비디오 모습

enter image description here

+0

내가 같은 문제가 ..하는 것을 잊지 마세요 한 비디오를 저장 해결책을 찾으면 여기에 대답하십시오. 아래의 – Vats

+0

내 솔루션, 당신을 도울 수 있기를 바랍니다! – Falex

답변

0

프리스트 작성하는 경우 어떻게하는 것보다

var switchCam = Bool() 

전면 카메라 전환 스위치

비디오

// 마크를 저장보다

0 사진 편집기 클래스에

override public func viewDidLoad() { 
     super.viewDidLoad() 


     if switchCam { 
      videoViewContainer.transform = CGAffineTransform(scaleX: -1, y: 1) 
     } else { 
      videoViewContainer.transform = CGAffineTransform(scaleX: 1, y: 1) 
     } 
} 

쓰기 : - photoLibrary가

func convertVideoAndSaveTophotoLibrary(videoURL: URL) { 
     let documentsDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] 
     let myDocumentPath = URL(fileURLWithPath: documentsDirectory).appendingPathComponent("temp.mp4").absoluteString 
     _ = NSURL(fileURLWithPath: myDocumentPath) 
     let documentsDirectory2 = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] as URL 
     let filePath = documentsDirectory2.appendingPathComponent("video.mp4") 
     deleteFile(filePath: filePath as NSURL) 

     //Check if the file already exists then remove the previous file 
     if FileManager.default.fileExists(atPath: myDocumentPath) { 
      do { try FileManager.default.removeItem(atPath: myDocumentPath) 
      } catch let error { print(error) } 
     } 

     // File to composit 
     let asset = AVURLAsset(url: videoURL as URL) 
     let composition = AVMutableComposition.init() 
     composition.addMutableTrack(withMediaType: AVMediaType.video, preferredTrackID: kCMPersistentTrackID_Invalid) 

     let clipVideoTrack = asset.tracks(withMediaType: AVMediaType.video)[0] 


     // Rotate to potrait 
     let transformer = AVMutableVideoCompositionLayerInstruction(assetTrack: clipVideoTrack) 

     var videoAssetOrientation_: UIImageOrientation = .up 
     var isVideoAssetPortrait_: Bool = false 

     let videoTransform:CGAffineTransform = clipVideoTrack.preferredTransform 



     if (videoTransform.a == 0.0 && videoTransform.b == 1.0 && videoTransform.c == -1.0 && videoTransform.d == 0) 
      || (videoTransform.a == 0.0 && videoTransform.b == -1.0 && videoTransform.c == 1.0 && videoTransform.d == 0) { 
      isVideoAssetPortrait_ = true 
     } 

     if videoTransform.a == 0 && videoTransform.b == 1.0 && videoTransform.c == -1.0 && videoTransform.d == 0 { 
      videoAssetOrientation_ = .right 
      isVideoAssetPortrait_ = true 
     } 
     if videoTransform.a == 0 && videoTransform.b == -1.0 && videoTransform.c == 1.0 && videoTransform.d == 0 { 
      videoAssetOrientation_ = .left 
      isVideoAssetPortrait_ = true 
     } 
     if videoTransform.a == 1.0 && videoTransform.b == 0 && videoTransform.c == 0 && videoTransform.d == 1.0 { 
      videoAssetOrientation_ = .up 
     } 
     if videoTransform.a == -1.0 && videoTransform.b == 0 && videoTransform.c == 0 && videoTransform.d == -1.0 { 
      videoAssetOrientation_ = .down 
     } 

     transformer.setTransform(clipVideoTrack.preferredTransform, at: kCMTimeZero) 

     var naturalSize = CGSize() 

     if isVideoAssetPortrait_ { 
      naturalSize = CGSize(width: clipVideoTrack.naturalSize.height, height: clipVideoTrack.naturalSize.width) 
     } else { 
      naturalSize = clipVideoTrack.naturalSize 
     } 







     var renderWidth: CGFloat! 
     var renderHeight: CGFloat! 

     renderWidth = naturalSize.width 
     renderHeight = naturalSize.height 

     let parentlayer = CALayer() 
     let videoLayer = CALayer() 
     let watermarkLayer = CALayer() 
     let watermarkLayer2 = CALayer() 



     watermarkLayer.contents = self.tempImageView.image?.cgImage 
     watermarkLayer.opacity = 1.0 


     parentlayer.frame = CGRect(x: 0, y: 0, width: renderWidth, height: renderHeight) 
     videoLayer.frame = CGRect(x: 0, y: 0, width: renderWidth, height: renderHeight) 

     watermarkLayer.frame = CGRect(x: 0, y: 0 ,width: renderWidth, height: renderHeight) 
     watermarkLayer2.frame = CGRect(x: 0, y: 0 ,width: renderWidth, height: renderHeight) 




     parentlayer.addSublayer(videoLayer) 
     parentlayer.addSublayer(watermarkLayer) 



     let videoComposition = AVMutableVideoComposition() 
     videoComposition.renderSize = CGSize(width: renderWidth, height: renderHeight) 
     videoComposition.frameDuration = CMTimeMake(1, 30) 
     videoComposition.renderScale = 1.0 

     // Add watermark to video 
     videoComposition.animationTool = AVVideoCompositionCoreAnimationTool(postProcessingAsVideoLayers: [videoLayer], in: parentlayer) 



     if switchCam { 
      let instruction = AVMutableVideoCompositionInstruction() 
      instruction.timeRange = CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(60, 30)) 
      var transform:CGAffineTransform = CGAffineTransform(scaleX: -1.0, y: 1.0) 
      transform = transform.translatedBy(x: -clipVideoTrack.naturalSize.width, y: 0.0) 
      transform = transform.rotated(by: CGFloat(Double.pi/2)) 
      transform = transform.translatedBy(x: 0.0, y: -clipVideoTrack.naturalSize.width) 

      transformer.setTransform(transform, at: kCMTimeZero) 
      instruction.layerInstructions = [transformer] 
      videoComposition.instructions = [instruction] 

     } else { 

      let instruction = AVMutableVideoCompositionInstruction() 
      instruction.timeRange = CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(60, 30)) 


      instruction.layerInstructions = [transformer] 
      videoComposition.instructions = [instruction] 
     } 



     let exporter = AVAssetExportSession.init(asset: asset, presetName: AVAssetExportPresetHighestQuality) 
     exporter?.outputFileType = AVFileType.mov 
     exporter?.outputURL = filePath 
     exporter?.videoComposition = videoComposition 

     exporter!.exportAsynchronously(completionHandler: {() -> Void in 
      if exporter?.status == .completed { 
       let outputURL: URL? = exporter?.outputURL 
       PHPhotoLibrary.shared().performChanges({ 
        PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: outputURL!) 
       }) { saved, error in 
        if saved { 
         let fetchOptions = PHFetchOptions() 
         fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)] 
         let fetchResult = PHAsset.fetchAssets(with: .video, options: fetchOptions).lastObject 
         PHImageManager().requestAVAsset(forVideo: fetchResult!, options: nil, resultHandler: { (avurlAsset, audioMix, dict) in 
          let newObj = avurlAsset as! AVURLAsset 
          print(newObj.url) 
          DispatchQueue.main.async(execute: { 
           print(newObj.url.absoluteString) 
          }) 
         }) 
         print (fetchResult!) 
        } 
       } 
      } 
     }) 


    }