AVPlayer 无法加载通过 xcode 重新 运行 应用程序后保存的 .mov 文件

AVPlayer can't load .mov file saved after re-running app via xcode

我有这个应用程序,主要目的是使用 AVFoundation 录制视频,然后保存输出文件委托。

首先,任何正常的 运行 应用程序都可以正确录制和保​​存视频,我可以将生成的输出文件 URL 加载到我在下一个 viewcontroller 上的 Avplayer 中。

如果 Xcode 不重新 运行,AVPlayer 将正常播放。我对 re运行ning 的意思是再次点击 Command+R 或单击 xcode 上的播放按钮以重建 re-运行.

当我再次 运行 应用程序时,我仍然可以看到文件并通过打印列出它们,但是当我尝试访问录制的文件时,应用程序将不再播放视频.似乎视频没有正确加载或任何东西,即使它已经在早些时候工作。发生这种情况后,我仍然可以继续录制新文件并播放新录制的文件,但不能播放旧文件。

重建应用程序之前的旧文件在 AVPlayer 上看起来像这样

此外,AVPlayer 会在我的观察者上成功 return .readyToPlay 状态。

我很困惑我该如何继续修复这个问题。

if let videoPreviewController = storyBoard.instantiateViewController(withIdentifier: "VideoPreviewController") as? VideoPreviewController {


                    let url = NSURL(fileURLWithPath: "file:///var/mobile/Containers/Data/Application/61E182ED-D490-4C7D-BAB7-C90D095C7E43/Documents/Thursday,%208%20June%202017%20at%201:47:51%20PM%20Philippine%20Standard%20Time.mov")
                    videoPreviewController.player = AVPlayer()
                    let playerItem = AVPlayerItem.init(url: url as URL)
                    videoPreviewController.player?.replaceCurrentItem(with: playerItem)

                    videoPreviewController.report = relationship
                    videoPreviewController.appointment = self.appointment
                    navigation.pushViewController(videoPreviewController, animated: true)
                }

你的问题是这一行:

  let url = NSURL(fileURLWithPath: "file:///var/mobile/Containers/Data/Application/61E182ED-D490-4C7D-BAB7-C90D095C7E43/Documents/Thursday,%208%20June%202017%20at%201:47:51%20PM%20Philippine%20Standard%20Time.mov")

每次您重新启动应用程序时,该路径都会发生变化——您无法对其进行硬编码。您必须向 OS 询问您的文档文件夹的路径并将您的文件名附加到它。

let userDocumentsURL =  FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]

let fileName = "Thursday,%208%20June%202017%20at%201:47:51%20PM%20Philippine%20Standard%20Time.mov"

let movieURL = userDocumentsURL.appendingPathComponent(fileName)

顺便说一下,这可能是您最初保存文件的方式...获取路径,附加文件名并保存。