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

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

Обновление - я обнаружил, что видео показывается перевернутым для обмена в Facebook или Messenger, но не в Mail. Я все еще могу сохранить видео, а затем загрузить его в 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( )
    })
}

Обмен - отправляет неправильную ориентацию

При передаче в другие приложения 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")

1 ответ

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

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

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