Как получить правильную ориентацию для видео из PhotoLibrary iOS

#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