如何从 PhotoLibrary iOS 中获取视频的正确方向
How to get correct Orientation for videos from PhotoLibrary iOS
我正在尝试实现 Instagram 视频裁剪功能。为此,我需要获得视频的正确 方向 ,我将用它以正确的宽高比布置我的 MPMoviePlayerController
视图,然后用户将能够平移视频并显示正方形视频将被裁剪。
我在获取视频的正确方向时遇到问题。我正在使用以下代码
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:fileUrl options:nil];
NSArray *tracks = [asset tracksWithMediaType:AVMediaTypeVideo];
AVAssetTrack *track = [tracks objectAtIndex:0];
UIInterfaceOrientation orientation =[self orientationForTrack:track];
// method to get orientation
- (UIInterfaceOrientation)orientationForTrack:(AVAssetTrack *)videoTrack
{
CGSize size = [videoTrack naturalSize];
CGAffineTransform txf = [videoTrack preferredTransform];
if (size.width == txf.tx && size.height == txf.ty)
return UIInterfaceOrientationLandscapeRight;
else if (txf.tx == 0 && txf.ty == 0)
return UIInterfaceOrientationLandscapeLeft;
else if (txf.tx == 0 && txf.ty == size.width)
return UIInterfaceOrientationPortraitUpsideDown;
else
return UIInterfaceOrientationUnknown;
}
我遇到的问题是,有时视频实际上是纵向的,上面的一段代码将其归类为横向,反之亦然。我只需要知道视频方向的两种状态 (横向或纵向)。我想要 MPMoviePlayerController
正在解释的完全相同的方向值。我的应用程序仅支持 Portrait 方向。任何帮助将不胜感激。
PS:以上代码对于从 iphone 相机拍摄的视频工作正常,通过 whatsapp 下载或共享的视频会导致问题。
AVAssetTrack
有 属性 preferredTransform
。您可以使用它来查找视频的实际方向。
AVAssetTrack *videoAssetTrack = [[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
UIImageOrientation videoAssetOrientation_ = UIImageOrientationUp;
CGFloat videoAngle = RadiansToDegrees(atan2(videoAssetOrientation_.b, videoAssetOrientation_.a));
int orientation = 0;
switch ((int)videoAngle) {
case 0:
orientation = UIImageOrientationRight;
break;
case 90:
orientation = UIImageOrientationUp;
break;
case 180:
orientation = UIImageOrientationLeft;
break;
case -90:
orientation = UIImageOrientationDown;
break;
default:
//Not found
break;
}
为我解决这个问题的唯一方法是使用以下方法从视频中捕获缩略图:
- (void)requestThumbnailImagesAtTimes:(NSArray *)playbackTimes timeOption:(MPMovieTimeOption)option
然后在缩略图上添加检查,例如:
if (singleFrameImage.size.height > singleFrameImage.size.width) {
// potrait video
} else {
// landscape video
}
此解决方案已针对从 iPhone 相机拍摄的视频以及从互联网随机下载的一组 (8-10) 视频进行了测试。
我正在尝试实现 Instagram 视频裁剪功能。为此,我需要获得视频的正确 方向 ,我将用它以正确的宽高比布置我的 MPMoviePlayerController
视图,然后用户将能够平移视频并显示正方形视频将被裁剪。
我在获取视频的正确方向时遇到问题。我正在使用以下代码
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:fileUrl options:nil];
NSArray *tracks = [asset tracksWithMediaType:AVMediaTypeVideo];
AVAssetTrack *track = [tracks objectAtIndex:0];
UIInterfaceOrientation orientation =[self orientationForTrack:track];
// method to get orientation
- (UIInterfaceOrientation)orientationForTrack:(AVAssetTrack *)videoTrack
{
CGSize size = [videoTrack naturalSize];
CGAffineTransform txf = [videoTrack preferredTransform];
if (size.width == txf.tx && size.height == txf.ty)
return UIInterfaceOrientationLandscapeRight;
else if (txf.tx == 0 && txf.ty == 0)
return UIInterfaceOrientationLandscapeLeft;
else if (txf.tx == 0 && txf.ty == size.width)
return UIInterfaceOrientationPortraitUpsideDown;
else
return UIInterfaceOrientationUnknown;
}
我遇到的问题是,有时视频实际上是纵向的,上面的一段代码将其归类为横向,反之亦然。我只需要知道视频方向的两种状态 (横向或纵向)。我想要 MPMoviePlayerController
正在解释的完全相同的方向值。我的应用程序仅支持 Portrait 方向。任何帮助将不胜感激。
PS:以上代码对于从 iphone 相机拍摄的视频工作正常,通过 whatsapp 下载或共享的视频会导致问题。
AVAssetTrack
有 属性 preferredTransform
。您可以使用它来查找视频的实际方向。
AVAssetTrack *videoAssetTrack = [[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
UIImageOrientation videoAssetOrientation_ = UIImageOrientationUp;
CGFloat videoAngle = RadiansToDegrees(atan2(videoAssetOrientation_.b, videoAssetOrientation_.a));
int orientation = 0;
switch ((int)videoAngle) {
case 0:
orientation = UIImageOrientationRight;
break;
case 90:
orientation = UIImageOrientationUp;
break;
case 180:
orientation = UIImageOrientationLeft;
break;
case -90:
orientation = UIImageOrientationDown;
break;
default:
//Not found
break;
}
为我解决这个问题的唯一方法是使用以下方法从视频中捕获缩略图:
- (void)requestThumbnailImagesAtTimes:(NSArray *)playbackTimes timeOption:(MPMovieTimeOption)option
然后在缩略图上添加检查,例如:
if (singleFrameImage.size.height > singleFrameImage.size.width) {
// potrait video
} else {
// landscape video
}
此解决方案已针对从 iPhone 相机拍摄的视频以及从互联网随机下载的一组 (8-10) 视频进行了测试。