为啥共享视频只发送到其他一些应用程序?

Posted

技术标签:

【中文标题】为啥共享视频只发送到其他一些应用程序?【英文标题】:Why does a shared video send upside down to only some other apps?为什么共享视频只发送到其他一些应用程序? 【发布时间】:2019-02-15 17:49:53 【问题描述】:

我使用 Swift 4 的 ios 应用能够保存或分享从前置或后置摄像头拍摄的视频。在我使用前置摄像头拍摄自拍视频并将视频共享到另一个应用程序的情况下,即使它以正确的方向保存,它也会将其倒置发送。据我所知,所有必要的转换都在保存或发送之前进行。

更新 - 我发现视频显示为翻转分享到 Facebook 或 Messenger,但不是邮件。我仍然可以保存视频,然后将其上传到 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( )
    )


分享 - 发送不正确的方向

分享到其他应用时,来自视频 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")

【问题讨论】:

你在哪里初始化fileUrl?看看会很有帮助。 我只是想可能更容易使用 fileUrl,将其转换为 NSUrl 并使用它来共享,而不是不必要地再次存储在文件系统中。 fileURL 在发生此代码的类定义中初始化。它是从转换到此视图的另一个视图控制器设置的。 我不知道您可以在不存储的情况下进行共享,因为在您选择应用程序后,该应用程序会离开屏幕并打开一个带有共享选项的新视图。 好吧,如果 fileUrl 是使用你的保存功能设置的,我认为它已经保存了。 【参考方案1】:

一点相机知识可能会解释您的问题

所有摄像头都倒置拍摄图像。这是由于光线如何进入镜头并撞击传感器 (exhibit 1)。因此,您会发现将视频作为 PHAsset 保存到您的照片库可能转换图片(而不是按照您的理论保留)以正确的方向。您还没有显示如何捕获视频的代码,但您可能会发现它是原始捕获并且您没有对其进行任何处理,因此它被反转了。

【讨论】:

我应该提到我在保存或共享之前在我的应用程序内的播放器内播放视频,没有额外的转换。至少它在应用程序中的方向是正确的。 捕获代码相当复杂,所以也许它的某个特定部分会有所帮助?请注意,当来自 URL 的视频在 AVPlayer 中播放时,共享和保存都可以作为选项使用。 如何将文件保存到磁盘?是原始相机捕捉吗? 查看我问题的最后一部分,了解它是如何存储的。如果您想了解更多信息,请告诉我。

以上是关于为啥共享视频只发送到其他一些应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

iOS版发送视频(屏幕共享)的数据包在后台UDP连接

用swift在ios上分享资源库视频

为啥我的视频在 ARJS 中只播放声音而没有视频?

从Url下载后分享视频

stm32 开启接收中断 PC 发送两次 为啥串口只接收到一次

如何使用 xmpp 库共享文件