2

对于我正在开发的应用程序,我需要提供一个功能,让用户将过滤器应用于他们的视频(不是实时的,在保存的视频上应用过滤器并提供 filePath)。

addFilterToVideo当用户点击过滤器时调用,视频合成作为参数传递给initPlayer函数,如果点击“无”视频过滤器,则传递 nil

每当点击新过滤器时,我只需更改 playerItem 的视频组成,并且文件仅在第一次加载

 func addFilterToVideo(filterName: String) {
    if filterName != "" {
      let filter = CIFilter(name: filterName)
      if #available(iOS 9.0, *) {
        let composition = AVVideoComposition(asset: (self.playerItem?.asset)!) { (request) in
          let source = request.sourceImage.clampingToExtent()
          filter?.setValue(source, forKey: kCIInputImageKey)
          let output = filter?.outputImage!.cropping(to: request.sourceImage.extent)
          request.finish(with: output!, context: FilterView.context)
        }
        self.selectedComposition = composition
        self.initPlayer(composition: composition)
      } else {
        // Fallback on earlier versions
      }} else {
      self.selectedComposition = nil
      self.initPlayer(composition: nil)
    }
  }

  func playerSetup(){
    self.playerItem = AVPlayerItem(url: URL(fileURLWithPath: self.filePath!))
    self.player = AVPlayer(playerItem: playerItem)
    self.playerLayer.player = self.player
    self.playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
    self.playerLayer.contentsGravity = kCAGravityResizeAspectFill
    self.layer.addSublayer(self.playerLayer)
    self.player?.play()
    flag = true
  }
  func initPlayer(composition: AVVideoComposition?){
    if composition != nil {
      if !flag {
        self.playerSetup()
      }
      playerItem?.videoComposition = composition
    } else {
      self.playerSetup()
    }
  }

所以问题是视频正在像这样旋转: 检查屏幕录制here 但是当我尝试使用我添加到项目中的示例视频时,它工作正常 检查屏幕录制here

所以我通过将它们作为 AVAssets 导入来检查preferredTransform

对于设备录制的视频文件:

(lldb) po videoTrack?.preferredTransform

- a : 0.0
- b : 1.0
- c : -1.0
- d : 0.0
- tx : 1080.0
- ty : 0.0

(lldb) po videoTrack?.naturalSize

- width : 1920.0
- height : 1080.0

对于我添加到项目中的视频

(lldb) po videoTrack?.preferredTransform

- a : 1.0
- b : 0.0
- c : 0.0
- d : 1.0
- tx : 0.0
- ty : 0.0

(lldb) po videoTrack?.naturalSize

- width : 1080.0
- height : 1920.0

所以问题出在filePath上的视频,它有一个preferredTransform,应该将视频旋转90度,甚至高度和宽度都关闭。我不知道该怎么做。我尝试将 CGAffineTransform 应用于 playerLayer,但它不起作用它确实旋转了视频,但纵横比仍然关闭,当资产具有不是身份的首选变换时,这意味着什么?

4

0 回答 0