shanth kumar
shanth kumar

Reputation: 25

unable to play video when app rebuild swift

video not playing when app rebuild (file path url saving into coreData) using AVCaptureSession

filepath not changing before and after rebuild.

file:///private/var/mobile/Containers/Data/Application/3DA93FBC-9A20-40B4-A017-B3D5C7768301/tmp/63F6CEED-3202-4F5F-999B-5F138D73635D.mp4

i did all the ways, nothing works

here my code for record the video

  func setupPreview() {
        // Configure previewLayer
        previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
       previewLayer?.frame = shapeLayer.bounds
    previewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
    shapeLayer.layer.addSublayer(previewLayer!)
    }
func setupSession() -> Bool {
   
       captureSession.sessionPreset = AVCaptureSession.Preset.high
   
       // Setup Camera
       let camera = AVCaptureDevice.default(for: AVMediaType.video)!
   
       do {
       
           let input = try AVCaptureDeviceInput(device: camera)
       
           if captureSession.canAddInput(input) {
               captureSession.addInput(input)
               activeInput = input
           }
       } catch {
           print("Error setting device video input: \(error)")
           return false
       }
   
       // Setup Microphone
       let microphone = AVCaptureDevice.default(for: AVMediaType.audio)!
   
       do {
           let micInput = try AVCaptureDeviceInput(device: microphone)
           if captureSession.canAddInput(micInput) {
               captureSession.addInput(micInput)
           }
       } catch {
           print("Error setting device audio input: \(error)")
           return false
       }
   
   
       // Movie output
       if captureSession.canAddOutput(movieOutput) {
           captureSession.addOutput(movieOutput)
       }
   
       return true
   }

func startSession() {
   
       if !captureSession.isRunning {
        videoQueue().async {
               self.captureSession.startRunning()
        }
       }
   }
func stopSession() {
        if captureSession.isRunning {
            videoQueue().async {
                self.captureSession.stopRunning()
            }
        }
    }
func videoQueue() -> DispatchQueue {
        return DispatchQueue.main
    }
func currentVideoOrientation() -> AVCaptureVideoOrientation {
        var orientation: AVCaptureVideoOrientation
    
        switch UIDevice.current.orientation {
            case .portrait:
                orientation = AVCaptureVideoOrientation.portrait
            case .landscapeRight:
                orientation = AVCaptureVideoOrientation.landscapeLeft
            case .portraitUpsideDown:
                orientation = AVCaptureVideoOrientation.portraitUpsideDown
            default:
                 orientation = AVCaptureVideoOrientation.landscapeRight
         }
    
         return orientation
     }
func startRecording() {
 
     if movieOutput.isRecording == false {
        save.setTitle("stop", for: UIControl.State.normal)
        
         let connection = movieOutput.connection(with: AVMediaType.video)
     
         if (connection?.isVideoOrientationSupported)! {
             connection?.videoOrientation = currentVideoOrientation()
         }
     
         if (connection?.isVideoStabilizationSupported)! {
             connection?.preferredVideoStabilizationMode = AVCaptureVideoStabilizationMode.auto
         }
     
         let device = activeInput.device
     
         if (device.isSmoothAutoFocusSupported) {
         
             do {
                 try device.lockForConfiguration()
                 device.isSmoothAutoFocusEnabled = false
                 device.unlockForConfiguration()
             } catch {
                print("Error setting configuration: \(error)")
             }
         
         }
     
         //EDIT2: And I forgot this
         outputURL = tempURL()
         movieOutput.startRecording(to: outputURL, recordingDelegate: self)
     
         }
         else {
            
             stopRecording()
         }
 
    }

func tempURL() -> URL? {
  
    let directory = NSTemporaryDirectory() as NSString
 let path = directory.appendingPathComponent(NSUUID().uuidString + ".mp4")
    path22 = path
    
    let directoryURL: URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
    let folderPath: URL = directoryURL.appendingPathComponent("Downloads", isDirectory: true)
    let fileURL: URL = folderPath.appendingPathComponent(path)
        return URL(fileURLWithPath: path)
 
}

func stopRecording() {

    if movieOutput.isRecording == true {
        movieOutput.stopRecording()
        
     }
}

here saving into coredata

    let managedObject = self.managedObjectContext
  entity = NSEntityDescription.entity(forEntityName: "MediaData", in: managedObject!)
      let personMO = NSManagedObject(entity: entity, insertInto: managedObject)
     
       personMO.setValue("\(self.videoURL!)", forKey: "videosS")
      personMO.setValue(dataImage, forKey: "thumbnails")
      print(personMO)
      do
      {
       try managedObject?.save()
          print("video saved")
      }
      catch
      {
          print("Catch Erroe : Failed To 
   

}

let appdel = UIApplication.shared.delegate as! AppDelegate appdel.avplayer = AVPlayer(url: videoURL!) print(videoURL!) let playerLayer = AVPlayerLayer(player: appdel.avplayer) playerLayer.frame = self.view.bounds self.view.layer.addSublayer(playerLayer) appdel.avplayer?.play()

Upvotes: 0

Views: 130

Answers (1)

matt
matt

Reputation: 535138

You must never save a full filepath into CoreData or anywhere else. File paths are not persistent. Your app is sandboxed. The sandbox path can change at any time, especially between launches and installations.

Instead, save the file name and reconstruct the path each time you need it. Just as you are calling FileManager.default.urls(for: .documentDirectory...) to construct the file path initially, so you must call it every time you want to access this file.

Upvotes: 1

Related Questions