After applying an AVVideoComposition
to my AVPlayerItem
, the filter I apply does work, but the video gets rotated in the AVPlayerLayer
.
I know for a fact that the problem is not with the filtered frame because if I show the frame in a UIImageView
, the frame is rendered 100% correctly.
The video shows correctly until I apply a videoComposition
. Setting the videoGravity
on the AVPlayerLayer
does not help.
The video gets rotated 90º clockwise and gets stretched in the layer.
Essentially, the video is displayed perfectly in the AVPlayerLayer
before the AVPlayerItem
is fed through the AVMutableVideoComposition
. Once that happens, the video is rotated -90º, and then scaled to fit the same dimensions as the video before filtering. This suggests to me that it does not realize that its transform is already correct, and so it is reapplying the transform on itself.
Why is this happening, and how can I fix it?
Here is some code:
private func filterVideo(with filter: Filter?) {
if let player = player, let playerItem = player.currentItem {
let composition = AVMutableComposition()
let videoAssetTrack = playerItem.asset.tracks(withMediaType: .video).first
let videoCompositionTrack = composition.addMutableTrack(withMediaType: .video, preferredTrackID: kCMPersistentTrackID_Invalid)
try? videoCompositionTrack?.insertTimeRange(CMTimeRange(start: kCMTimeZero, duration: playerItem.asset.duration), of: videoAssetTrack!, at: kCMTimeZero)
videoCompositionTrack?.preferredTransform = videoAssetTrack!.preferredTransform
let videoComposition = AVMutableVideoComposition(asset: composition, applyingCIFiltersWithHandler: { (request) in
let filteredImage = <...>
request.finish(with: filteredImage, context: nil)
})
playerItem.videoComposition = videoComposition
}
}
What worked for me at the end:
This is the
filterImage
function ofFilter
, which is just a nice little wrapper forCIFilter
:Try this code below which worked for me
And then go ahead an export your video....
If You are trying to play
AVMutableCompostion
You should setAVAssetTrack
'spreferredTransform
toAVMutableCompositionTrack
'spreferredTransform
.You have problem in the renderingSize of
AVVideoComposition
you should apply transform onAVMutableVideoCompositionInstruction
(ie.Rotate
andtranslate
transform ) .i have done in Objective-c i am posting my code you can convert the syntax into Swift
Objective-c
Instead of assuming that the image will be filtered, check first if
filteredImage
isnil
. If not, thenrequest.finish(with: filteredImage, context: nil)
However, if it is
nil
you mustrequest.finish(with: SomeError)
This is as per the docs.