#ios #objective-c #video #mpmovieplayercontroller #uiinterfaceorientation
#iOS #objective-c #Видео #mpmovieplayercontroller #uiinterfaceorientation
Вопрос:
Я пытаюсь реализовать функцию обрезки видео 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 amp;amp; size.height == txf.ty)
return UIInterfaceOrientationLandscapeRight;
else if (txf.tx == 0 amp;amp; txf.ty == 0)
return UIInterfaceOrientationLandscapeLeft;
else if (txf.tx == 0 amp;amp; txf.ty == size.width)
return UIInterfaceOrientationPortraitUpsideDown;
else
return UIInterfaceOrientationUnknown;
}
Проблема, с которой я сталкиваюсь, заключается в том, что иногда видео, которые на самом деле находятся в портретном режиме, в приведенном выше фрагменте кода классифицируют как альбомную ориентацию и наоборот. Мне нужно знать только два состояния ориентации видео (альбомная или портретная). Я хочу точно такое же значение ориентации, которое MPMoviePlayerController
интерпретирует. Мое приложение поддерживает только портретную ориентацию. Любая помощь была бы высоко оценена.
PS: Приведенный выше код отлично работает для видео, снятых с камеры iphone, проблема возникает из-за видео, которые загружаются или передаются через WhatsApp.
Комментарии:
1. может быть, эта ссылка поможет вам gist.github.com/lukabernardi/5020724
2. нет, это не так. я решил эту проблему, я загружу решение, когда у меня будет немного времени. Спасибо за вашу помощь.
3. ОК. поместите это так, чтобы другие получили некоторую помощь …. : )
Ответ №1:
Единственный способ, который решил эту проблему для меня, — это захватить уменьшенное изображение из видео с помощью метода:
- (void)requestThumbnailImagesAtTimes:(NSArray *)playbackTimes timeOption:(MPMovieTimeOption)option
а затем добавить проверку на уменьшенном изображении, например :
if (singleFrameImage.size.height > singleFrameImage.size.width) {
// potrait video
} else {
// landscape video
}
Это решение протестировано на видео, снятом с камеры iPhone, а также на наборе (8-10) видео, случайно загруженных из Интернета.
Ответ №2:
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;
}
Комментарии:
1. это работает только для видео, снятых с камеры iPhone, это не работает для случайных видео, загруженных из Интернета.
2. я решил эту проблему, я опубликую решение, как только у меня появится немного свободного времени. Спасибо за вашу помощь.
3. Я думаю, что предлагаемый код правильный, но вам также необходимо применить эту ориентацию к размеру видеоактива. Я имею в виду, что если ориентация равна 0 или 180, то isLandscape = width > height, но это 90 или -90, тогда isLandscape = width < height