当前位置: 首页 > 知识库问答 >
问题:

应用程序重建时无法播放视频

茅涵映
2023-03-14

使用AVCaptureSession重建应用程序(文件路径url保存到coreData)时不播放视频

文件路径在重建前后未更改。

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

我做了所有的方法,没有任何效果

这是我录制视频的代码

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

函数停止录制(){

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

这里保存到核心数据

    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 
   

}

让appdel=UIApplication.shared.delegate!appdel.avplayer=AVPlayer打印(视频URL!)让playerLayer=AVPlayerLayer(玩家:appdel.avplayer)playerLayer.frame=self.view.boundsself.view.layer.add子层(playerLayer)appdel.avplayer?.play()

共有1个答案

岑元徽
2023-03-14

决不能将完整文件路径保存到CoreData或其他任何位置。文件路径不是持久的。你的应用程序已沙盒。沙箱路径可以随时更改,特别是在启动和安装之间。

相反,保存文件名,并在每次需要时重建路径。正如您正在调用FileManager.default.urls(for:. docentDirectory...)来构造文件路径一样,因此您必须在每次要访问该文件时调用它。

 类似资料:
  • 如何继续播放视频时,我们按下主页按钮和应用程序转到后台?那时,我们仍然可以听音频并在另一个应用程序上工作。我们应该添加服务来控制视频播放吗?

  • 在我的应用程序中,我想显示来自服务器URI路径的视频,在这里,第一次播放视频,当我想第二次播放视频时,视频没有播放,并显示一个弹出窗口,如无法播放此视频 下面是我的错误 提前谢谢。

  • 问题内容: 我遵循了一些有关结合JavaFX与Swing(JFrame)来播放视频的教程,但是我得到的只是一个黑屏,该视频应该没有任何实际的内容播放,也没有报错。 我在这里做错什么,为什么不播放视频? 我尝试了几个.flv视频,但都不会开始播放(当我在浏览器中打开它们时,它们会播放) 我在装有K-lite完整编解码器包的Windows 8.1 N Pro上运行jre7和jdk1.7.0_45 编辑

  • 我使用下载管理器将文件下载到外部存储器。我使用设置下载文件夹的目标 成功后,我用 这给了我这个 现在我试着用intent播放这个视频文件 这里的内容Uri是 但当我使用action\u share intent时,它也不会被其他应用程序识别。 此外,必须删除包含file://的文件uri,并将其替换为/storage/emulated/0/Download/dishapatani\u Jan 07

  • 问题内容: 我正在使用Flask提供.m3u8和.ts文件来模拟vod流。 视频播放器不会流式传输文件并显示错误(请参见下面的屏幕截图)。我找不到它是什么错误的日志。 我缺少某处的日志消息吗?是什么原因造成的,我该如何解决? 问题答案: 默认情况下,开发服务器以单线程模式运行,这意味着它一次只能处理一个请求。你一次请求两个文件流,.m3u8和.ts。你可以传递或以允许一次处理多个请求,但是,用它自