ios - 为什么 uiimagePickerController.mediaTypes = [kUTTypeMovie as String] 包括 Live Photos 作为 Bounce 或 Loop Effect 作为 Video?

标签 ios swift uiimagepickercontroller avplayer uiimagepickercontrollermediatype

我使用 UIImagePicker 仅从我的库中选择视频,并将我的媒体类型设置为:

imagePicker.mediaTypes = [kUTTypeMovie as String]

我注意到,当展示库时,即使我只希望看到视频,如果库中有一张带有 BounceLoop 效果的实时照片,它也出现了。如果我拍摄同一张照片并将其效果切换为 LiveLong Exposure,它将不再显示在图库中。如果我将它切换回 BounceLoop 它会重新出现。

我已经尝试了 .photoLibrary.savedPhotosAlbum 并且发生了同样的事情。

我问的原因是因为我想让他们远离图书馆,我只想选择 xxx 秒或更长时间的视频。

  1. 即使我只选择视频,为什么这些效果类型会出现在图像选择器库中?
  2. 为什么只有LoopBounce出现,而Long ExposureLive没有出现?
  3. 如何将它们拒之门外?

也许这是一个单独的问题,但由于它属于相同的 LiveBounce 照片问题,所以我添加了它。我注意到,如果我将源自 LiveBounce 照片的 url 放入 AVPlayer 中,如果我进入后台并返回,当该应用程序回到前台,它只发生在这 2 个效果(不应该可用)。当应用程序进入后台时,我使用此方法正确删除了 AVPlayerLayer Remove AVPlayerLayer但是当在播放器中初始化来自那些影响类型的 url 时,它仍然在前台短暂地卡住(应用程序没有响应)。

代码:

import MobileCoreServices
import AVFoundation

class ViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate{

var playerItem: AVPlayerItem?
var player: AVPlayer?
var playerLayer: AVPlayerLayer?
var currentPlayTime: CMTime?
let imagePicker = UIImagePickerController()

override func viewDidLoad() {
    super.viewDidLoad()

    imagePickerController.delegate = self

    NotificationCenter.default.addObserver(self, selector: #selector(appHasEnteredBackground), name: Notification.Name.UIApplicationWillResignActive, object: nil)

    NotificationCenter.default.addObserver(self, selector: #selector(appWillEnterForeground), name: Notification.Name.UIApplicationWillEnterForeground, object: nil)
}

override func viewDidLayoutSubviews() {
    // I have a UIView Outlet for the AVPlayerLayer named viewForPlayerLayer.

    guard let playerLayer = playerLayer else { return }
    playerLayer.videoGravity = .resizeAspectFill
    viewForPlayerLayer.layer.insertSublayer(playerLayer, at: 0)
    playerLayer.frame = viewForPlayerLayer.bounds
    playerLayer.masksToBounds = true

}

@IBAction fileprivate func showLibraryButtonTapped(_ sender: UIButton) {

    imagePicker.sourceType = UIImagePickerControllerSourceType.photoLibrary // .savedPhotosAlbum also tried 
    imagePicker.mediaTypes = [kUTTypeMovie as String]
    imagePicker.videoMaximumDuration = 60
    present(imagePicker, animated: true, completion: nil)
}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {

    if let url = info[UIImagePickerControllerMediaURL] as? URL{

          let asset = AVAsset(url: url)
          playerItem = AVPlayerItem(asset: asset)
          player = AVPlayer(playerItem: playerItem!)
          playerLayer = AVPlayerLayer(player: player)
          player?.play()
    }
    imagePicker.dismiss(animated: true, completion: nil)
}

func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
    imagePicker.dismiss(animated: true, completion: nil)
}

@objc fileprivate func appHasEnteredBackground() {

    currentPlayTime = player.currentTime()

    if player.isPlaying{
        player.pause()
    }

    playerLayer = nil
}

@objc fileprivate func appWillEnterForeground(){

    if let player = player, let currentPlayTime = currentPlayTime{

        playerLayer = AVPlayerLayer(player: player)

        player.seek(to: currentPlayTime, toleranceBefore: kCMTimeZero, toleranceAfter: kCMTimeZero)
    }
}

}

最佳答案

如果您要求显示视频,则无法阻止循环/反弹实时照片视频出现在选取器中,因为它们视频。但是,如果用户在委托(delegate)方法中选择 一个,您可以检测到一个。为此,UIImagePickerControllerMediaType 不够精细。相反,获取照片库授权并获取由 UIImagePickerControllerPHAsset 键返回的 PHAsset,并检查其 playbackStyle。这将得出您想要的区别。

https://developer.apple.com/documentation/photos/phasset.playbackstyle

.videoLooping 是弹跳或缩放实时照片。

关于ios - 为什么 uiimagePickerController.mediaTypes = [kUTTypeMovie as String] 包括 Live Photos 作为 Bounce 或 Loop Effect 作为 Video?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49413685/

相关文章:

ios - 如何在加载 UIwebview 时集成 MBProgressHUD?

swift - TableView 单元格可选 - swift

objective-c - 使用 objective-c 将html字符串插入sqlite db

ios - React Native iOS 没有构建

ios - 如何更改组 UITableView 中第一行和最后一行的颜色?

ios - 如何更改 UIImagePicker 中的条形颜色?

ios - 按下 actionSheet 按钮后的警告消息

ios - 闹钟锁屏通知

ios - 使用 MKMapView 和 MKRoute 获取方向问题

ios - 如何以编程方式计算 UIImagePickerController 工具栏的高度?