Почему общедоступное видео переходит с ног на голову только на некоторые другие приложения? - PullRequest
0 голосов
/ 15 февраля 2019

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

Обновление - я обнаружил, что видео показывается перевернутым для обмена в 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( )
    })
}

Общий доступ - отправка неверной ориентации

При совместном использовании с другими приложениями 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 Ответ

0 голосов
/ 15 февраля 2019

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

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

...