最近项目中的视频播放模块有些视频是横着的,要求客户端将其视频处理下,竖着展示,于是乎,用了以下方法
尝试用mpmovieplayercontroller是可以正确识别的.随即动手来尝试自己来做旋转.
我们可以通过avasset来获得这个转置矩阵.估计因为视频是自己用avassetWriter自己写的转置矩阵,所以[avasset preferredTransform]取不到正确的转置矩阵.只能从视频轨道里获取代码如下:
CGAffineTransform txf = [videoTrack preferredTransform];```
不知道为什么直接把CGAffineTransform设置给AVPlayerLayer.transfrom是无效的.
离散数学学的不不好所以也没管这个矩阵具体是什么.不过简单看下CGAffineTransform有6个值分别是a,b,c,d,tx,ty;
没具体的去看文档.不过大概猜测了一下就是a,b,c,d 分别代表上,左,下,右,4个方向分别用正负1来表示是否颠倒,
所以我们可以根据这个来转置我们AVPlayerLayer
```if (txf.b == -1 && txf.c == 1) {
videoLayer.transform = CATransform3DMakeAffineTransform(CGAffineTransformMakeRotation(-M_PI_2));
videoLayer.frame = CGRectMake(0.0f, 0.0f, cover.frame.size.width, cover.frame.size.height);;
}else if (txf.b == 1 && txf.c == -1){
videoLayer.transform = CATransform3DMakeAffineTransform(CGAffineTransformMakeRotation(M_PI_2));
videoLayer.frame = CGRectMake(0.0f, 0.0f, cover.frame.size.width, cover.frame.size.height);
}else if (txf.a == -1 && txf.d == -1) {
playerBackgroundView.transform = CGAffineTransformMakeRotation(M_PI);
}```
注意旋转完layer需要重置layer的size.
只是核心代码,业务逻辑就不写了。
网友评论