Почему общее видео отправляется вверх ногами только в некоторые другие приложения?

В моем приложении 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? Было бы полезно посмотреть.

Pranav Kasetti 15.02.2019 19:04

Я просто подумал, что может быть проще использовать fileUrl, преобразовать его в NSUrl и использовать для совместного использования, а не без необходимости снова сохранять в файловой системе.

Pranav Kasetti 15.02.2019 19:09

fileURL инициализируется в определении класса, в котором находится этот код. Он устанавливается из другого контроллера представления, который переходит к этому представлению.

Chewie The Chorkie 15.02.2019 19:09

Я не знал, что вы можете поделиться без сохранения, потому что приложение исчезает с экрана и открывает новое представление с параметрами общего доступа после того, как вы выберете приложение.

Chewie The Chorkie 15.02.2019 19:12

хорошо, если fileUrl установлен с использованием вашей функции сохранения, я думал, что он уже сохранен.

Pranav Kasetti 15.02.2019 19:14

Сохранение и совместное использование — это функции, которые выполняются отдельно по выбору пользователя.

Chewie The Chorkie 15.02.2019 19:16

Это было задано давно, но у меня все еще есть эта проблема, и ответов не видно.

Chewie The Chorkie 25.07.2019 20:26
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
345
1

Ответы 1

Немного знаний о камере может объяснить вашу проблему

Все камеры снимают изображения в перевернутом виде. Это связано с тем, как свет попадает в объектив и попадает на датчик (экспонат 1). Итак, вы обнаружите, что сохранение видео в вашей библиотеке фотографий в качестве PHAsset, вероятно, трансформирует изображения (не сохраняет, как вы предполагали) в правильной ориентации. Вы не показали код того, как вы захватываете видео, но вы можете обнаружить, что это необработанный захват, и вы не выполняете его обработку, поэтому оно инвертируется.

Я должен был упомянуть, что я воспроизвожу видео внутри проигрывателя в своем приложении без дополнительных преобразований перед сохранением или передачей. По крайней мере, в приложении он находится в правильной ориентации.

Chewie The Chorkie 15.02.2019 19:04

Код захвата довольно сложен, так что, может быть, есть какая-то его часть, которую было бы полезно увидеть? Просто чтобы вы знали, что и совместное использование, и сохранение доступны в качестве параметров, когда видео с URL-адреса воспроизводится в AVPlayer.

Chewie The Chorkie 15.02.2019 19:15

Как сохранить файл на диск? Это необработанный снимок камеры?

Chris 15.02.2019 19:18

См. последнюю часть моего вопроса, чтобы узнать, как он хранится. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

Chewie The Chorkie 15.02.2019 19:27

Другие вопросы по теме