Отображение отфильтрованного видеофайла с предпочтительным преобразованием, которое не является идентификатором swift - PullRequest
0 голосов
/ 30 июня 2018

Для приложения, над которым я работаю, мне нужно предоставить функциональность, которая позволит пользователям применять фильтры к своим видео (не в реальном времени, применяются фильтры к сохраненному видео и filePath).

addFilterToVideo вызывается, когда пользователь нажимает на фильтр, композиция видео передается в качестве параметра функции initPlayer, и если видеофильтр "none" используется, ноль передается

Всякий раз, когда включается новый фильтр, я просто изменяю видео композицию 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()
    }
  }

Итак, проблема в том, что видео вращается так: проверьте запись экрана здесь но когда я попытался использовать пример видео, которое я добавил в проект, он работал нормально проверьте запись экрана здесь

поэтому я проверил предпочитаемое преобразование, импортировав их как AVAssets

Для видеофайла, записанного устройством:

(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, у него есть предпочтительный преобразователь, который должен поворачивать видео на 90 градусов, и даже высота и ширина отключены. Я не уверен, как это сделать. Я попытался применить CGAffineTransform к playerLayer, но это не сработало. Оно действительно повернуло видео, но соотношение сторон все еще отключено, и что это значит, когда актив имеет предпочтительное преобразование, которое не является идентичностью?

...