我使用Swift 4的iOS应用程序可以保存或分享从前置或后置摄像头拍摄的视频。在我拍摄自拍视频,使用前置摄像头并将视频分享到另一个应用程序的情况下,即使它以正确的方向保存,它也会将其上下颠倒。据我所知,在保存或发送之前,所有必要的转换都会发生。
更新 - 我发现视频显示翻转共享到Facebook或Messenger,但没有邮件。我仍然可以保存视频,然后将其上传到Facebook或Messenger,它将处于正确的方向。
我把它缩小到保存和共享之间的区别,但我不知道它是什么。
保存 - 发送正确的方向
为了保存,会将URL发送到我的保存功能。 assetCollection是一个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")
一些相机传说可能会解释你的问题
所有相机都会颠倒拍摄图像。这是由于光线如何进入镜头并撞击传感器(exhibit 1)。因此,您会发现将视频保存到您的照片库,因为PHAsset可能会将图片(不是您理论上的保留)转换为正确的方向。您没有显示捕获视频的代码,但您可能会发现它是一个原始捕获,并且您不对其进行处理,因此它被反转。