对于我正在开发的应用程序,我需要提供一个功能,让用户将过滤器应用于他们的视频(不是实时的,在保存的视频上应用过滤器并提供 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,但它不起作用它确实旋转了视频,但纵横比仍然关闭,当资产具有不是身份的首选变换时,这意味着什么?