- 最近播放手机本地拍摄的视频出现了一个很奇怪的问题,我明明是拿着手机竖拍的,结果播放的时候视频却旋转了90度,这让我想不明白。于是网上找寻了资料,看到一篇文章说到了这个视频方向。在相册里播放的时候看到的视频方向与视频本身真正的方向很有可能是不一样的。我们平时拿着手机横拍的视频,在相册里播放的时候它会自动帮你调整方向,让你有一个正常视觉。根据那篇文章,再根据我使用的播放器(GPUImageMovie),我查询得到视频角度后对视图(GPUImageView)进行旋转,从而解决了视频方向的问题。但这里只是解决了一个表面问题,假如你的视频需要上传,那么你肯定要对这个视频本身去做旋转了。
AVAsset *ass = [AVAsset assetWithURL:path];
self.inputAsset = ass;
NSArray *tracks = [ass tracksWithMediaType:AVMediaTypeVideo];
if([tracks count]>0){
AVAssetTrack *videoTrack = [tracks objectAtIndex:0];
CGAffineTransform t = videoTrack.preferredTransform;
if(t.a == 0 && t.b == 1.0 && t.c == -1.0 && t.d == 0){
// Portrait
degress = 90;
}else if(t.a == 0 && t.b == -1.0 && t.c == 1.0 && t.d == 0){
// PortraitUpsideDown
degress = 270;
}else if(t.a == 1.0 && t.b == 0 && t.c == 0 && t.d == 1.0){
// LandscapeRight
degress = 0;
}else if(t.a == -1.0 && t.b == 0 && t.c == 0 && t.d == -1.0){
// LandscapeLeft
degress = 180;
}
}
//创建摄像头视图
GPUImageView *filterView = [[GPUImageView alloc]initWithFrame:CGRectMake(0, 0, ScreenWidth, ScreenHeight)];
switch (degress) {
case 90:
[filterView setInputRotation:kGPUImageRotateRight atIndex:0];
break;
case 180:
[filterView setInputRotation:kGPUImageRotate180 atIndex:0];
break;
case 270:
[filterView setInputRotation:kGPUImageRotateLeft atIndex:0];
break;
default:
break;
}
```
- 其实视频方向只有4个角度:0,90,180,270.我拿手机测试了,再根据这些角度去旋转。
- 关于调整视频本身角度问题,我还没有完全解决,我从相册里拿到视频后假如有方向不对的,我可以调整角度再次保存到相册,这个是没有问题的,但是奇怪的是假如我在我的程序中拍摄视频,然后调整方向保存到本地时没有视频画面,但是音轨在,播放的时候能听到声音,画面是一片黑的。