7

Я пытаюсь реализовать функцию обрезки видеоролика Instagram. Для этого мне нужно правильно установить Ориентация видео, с которой я смогу отобразить изображение в правильном соотношении сторон, и тогда пользователь сможет панорамировать видео, а показанное квадратное видео будет обрезано по действию.Как получить правильную ориентацию для видео из PhotoLibrary iOS

У меня возникла проблема с правильной ориентацией видео. Я использую следующий код

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. Мое приложение поддерживает только Портрет ориентация. Любая помощь будет высоко оценен.

PS: Над кодом работает отлично для видеозаписей, снятых с камеры iphone, видео, которые загружаются или передаются через whatsapp, вызывают проблему.

+0

Возможно, эта ссылка поможет вам https://gist.github.com/lukabernardi/5020724 –

+0

Нет, нет. Я решил эту проблему, я выгружу решение, когда я получу некоторое время. Спасибо за вашу помощь. – Usama

+0

ОК. Положите это, чтобы другие получили некоторую помощь ....:) –

ответ

5

Единственный способ, который решил эту проблему для меня, чтобы захватить миниатюрное изображение из видео с помощью метода:

- (void)requestThumbnailImagesAtTimes:(NSArray *)playbackTimes timeOption:(MPMovieTimeOption)option 

, а затем добавить проверку на уменьшенное изображение, как:

if (singleFrameImage.size.height > singleFrameImage.size.width) { 
    // potrait video 
} else { 
    // landscape video 
} 

Это решение тестируется на видео, снятое с камеры iPhone, а также на наборе (8-10) видео, случайно загруженных из Интернета.

4

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; 
} 
+0

это работает только для видео, снятых с камеры iphone, оно не работает для случайных видеороликов, загружаемых из Интернета. – Usama

+0

Я решил эту проблему, я выложу решение, как только я получу свободное время. Спасибо за вашу помощь. – Usama

+0

Я предполагаю, что предлагаемый код прав, но вам также необходимо применить эту ориентацию к размеру видео активов. Я имею в виду, если ориентация равна 0 или 180, то isLandscape = width> height, но это 90 или -90, тогда isLandscape = width markov