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