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)
顺便说一下,这可能是您最初保存文件的方式...获取路径,附加文件名并保存。
我有这个应用程序,主要目的是使用 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)
顺便说一下,这可能是您最初保存文件的方式...获取路径,附加文件名并保存。