В моем приложении iOS, использующем Swift 4, есть возможность сохранять или делиться видео, снятыми с передней или задней камеры. В случае, когда я делаю селфи-видео с помощью фронтальной камеры и делюсь видео с другим приложением, оно отправляет его вверх ногами, даже если оно сохраняется с правильной ориентацией. Насколько я знаю, все необходимые преобразования происходят перед сохранением или отправкой.
Обновлять — я обнаружил, что видео показывается перевернутым для отправки в Facebook или Messenger, но не в Mail. Я все еще могу сохранить видео, а затем загрузить его в 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( )
})
}
Совместное использование — отправляет неправильную ориентацию
При совместном использовании с другими приложениями NSData из URL-адреса видео (self.fileURL) записывается в путь к файлу, где создается новый 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, преобразовать его в NSUrl и использовать для совместного использования, а не без необходимости снова сохранять в файловой системе.
fileURL инициализируется в определении класса, в котором находится этот код. Он устанавливается из другого контроллера представления, который переходит к этому представлению.
Я не знал, что вы можете поделиться без сохранения, потому что приложение исчезает с экрана и открывает новое представление с параметрами общего доступа после того, как вы выберете приложение.
хорошо, если fileUrl установлен с использованием вашей функции сохранения, я думал, что он уже сохранен.
Сохранение и совместное использование — это функции, которые выполняются отдельно по выбору пользователя.
Это было задано давно, но у меня все еще есть эта проблема, и ответов не видно.





Немного знаний о камере может объяснить вашу проблему
Все камеры снимают изображения в перевернутом виде. Это связано с тем, как свет попадает в объектив и попадает на датчик (экспонат 1). Итак, вы обнаружите, что сохранение видео в вашей библиотеке фотографий в качестве PHAsset, вероятно, трансформирует изображения (не сохраняет, как вы предполагали) в правильной ориентации. Вы не показали код того, как вы захватываете видео, но вы можете обнаружить, что это необработанный захват, и вы не выполняете его обработку, поэтому оно инвертируется.
Я должен был упомянуть, что я воспроизвожу видео внутри проигрывателя в своем приложении без дополнительных преобразований перед сохранением или передачей. По крайней мере, в приложении он находится в правильной ориентации.
Код захвата довольно сложен, так что, может быть, есть какая-то его часть, которую было бы полезно увидеть? Просто чтобы вы знали, что и совместное использование, и сохранение доступны в качестве параметров, когда видео с URL-адреса воспроизводится в AVPlayer.
Как сохранить файл на диск? Это необработанный снимок камеры?
См. последнюю часть моего вопроса, чтобы узнать, как он хранится. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.
Где вы инициализируете fileUrl? Было бы полезно посмотреть.