7

Instagramビデオクロッピング機能を実装しようとしています。そのために私は正確なオリエンテーションビデオの私のレイアウトMPMoviePlayerController正しいアスペクト比で表示する必要があり、ユーザーはビデオをパンすることができ、正方形のビデオが動作時に切り取られます。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; 
} 

私が午前問題は、いくつかの回は、コードの一部上記の肖像画に実際にある動画は、風景やその逆として分類されていることであるを使用しています。私は、ビデオの向きの2つの状態を知る必要があります(風景またはポートレート)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

私は、提案されたコードが正しいと思うが、あなたはまた、ビデオアセットのサイズにその方向を適用する必要があります。私はorientationが0または180で、isLandscape = width> heightだが、90または-90ならばisLandscape = width markov

関連する問題