【发布时间】:2019-02-15 17:49:53
【问题描述】:
我使用 Swift 4 的 iOS 应用能够保存或分享从前置或后置摄像头拍摄的视频。在我使用前置摄像头拍摄自拍视频并将视频共享到另一个应用程序的情况下,即使它以正确的方向保存,它也会将其倒置发送。据我所知,所有必要的转换都在保存或发送之前进行。
更新 - 我发现视频显示为翻转分享到 Facebook 或 Messenger,但不是邮件。我仍然可以保存视频,然后将其上传到 Facebook 或 Messenger,并且方向正确。
我已将其缩小为保存和共享之间的区别,但我不知道它是什么。
保存 - 发送正确的方向
为了保存,将一个 URL 发送到我的保存函数。 assetsCollection 是一个 PHAssetCollection。发生 PHAssetCollectionChangeRequest 并保存视频。
func save(URL: URL, completion : @escaping () -> ()) {
if assetCollection == nil {
print("error upstream. save skipped")
return // if there was an error upstream, skip the save
}
PHPhotoLibrary.shared().performChanges({
print("saving")
let assetChangeRequest = PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: URL)
let assetPlaceHolder = assetChangeRequest?.placeholderForCreatedAsset
let albumChangeRequest = PHAssetCollectionChangeRequest(for: self.assetCollection)
let enumeration: NSArray = [assetPlaceHolder!]
if self.assetCollection.estimatedAssetCount == 0
{
albumChangeRequest!.addAssets(enumeration)
}
else {
albumChangeRequest!.insertAssets(enumeration, at: [0])
}
}, completionHandler: { status , error in
completion( )
})
}
分享 - 发送不正确的方向
分享到其他应用时,来自视频 URL (self.fileURL) 的 NSData 被写入文件路径,在该文件路径中创建新 URL 并放入 objectsToShare 数组。
let urlData = NSData(contentsOf: self.fileURL)
if urlData != nil {
let paths:[String] = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
let docDirectory:String = paths[0]
let filePath:String = "\(docDirectory)/tmpVideo.mp4"
urlData?.write(toFile: filePath, atomically: true)
let videoLink = NSURL(fileURLWithPath: filePath)
let objectsToShare:[NSURL] = [videoLink]
let activity: UIActivityViewController = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil)
DispatchQueue.main.async {
UIApplication.topViewController?.present(activity, animated: true, completion: nil)
}
}
PHPhotoLibrary 是否保留对视频进行的方向转换,而共享则不保留?共享时如何使其行为相同?
顺便说一句,我还尝试将视频保存到我的照片库中,然后在另一个应用程序中从我的库中选择视频并发送,并且方向正确。只用我的共享代码颠倒发送。
视频如何临时存储以供以后保存或共享:
我首先使用一个临时目录。这是在保存或共享之前预览视频。这里的“url”是我导出视频的地方,稍后保存或共享功能会使用它。
let tempDir = NSTemporaryDirectory()
let url = NSURL(fileURLWithPath: tempDir).appendingPathComponent("tmpMov.mov")
【问题讨论】:
-
你在哪里初始化fileUrl?看看会很有帮助。
-
我只是想可能更容易使用 fileUrl,将其转换为 NSUrl 并使用它来共享,而不是不必要地再次存储在文件系统中。
-
fileURL 在发生此代码的类定义中初始化。它是从转换到此视图的另一个视图控制器设置的。
-
我不知道您可以在不存储的情况下进行共享,因为在您选择应用程序后,该应用程序会离开屏幕并打开一个带有共享选项的新视图。
-
好吧,如果 fileUrl 是使用你的保存功能设置的,我认为它已经保存了。
标签: ios swift video file-sharing phphotolibrary