2012-02-14 12 views
9

私はiOS開発の初心者です。私はMPMoviePlayerControllerで再生されているビデオのサイズが必要なアプリケーションを開発しています。ビデオの寸法を客観的なcでプログラム的に取得

私はMPMoviePlayerControllerのnaturalSizeプロパティを使用して、再生されるビデオのサイズを取得しています。

@property(nonatomic, readonly) CGSize naturalSize; 

しかし、問題は、ビデオがMPMoviePlayerControllerで再生されるときだけ自然なサイズが得られることです。

ビデオがMPMoviePlayerControllerで再生される前に、そのサイズを取得できる方法はありますか?

- EDIT -

私はこの問題を解決するために近づくことができる他の回避策はありますか?助けてください。

+0

また、 'MPMoviePlayerController'の' duration'プロパティもあります。 – tipycalFlow

+0

@tipycalFlowはい、私はそのプロパティを見ましたが、実際に再生される前にMPMoviePlayerControllerオブジェクトで再生される予定のビデオの高さと幅を指定します。 – An1Ba7

答えて

7

MPMoviePlayerControllerがビデオメタデータをロードするのに時間がかかるので、リスナーを追加して、naturalSizeがロードされるのを待つ必要があります。このような何か:

[[NSNotificationCenter defaultCenter] addObserver:self 
       selector:@selector(movieNaturalSizeAvailable:) 
       name:MPMovieNaturalSizeAvailableNotification 
       object:myMoviePlayer]; 

そしてmovieNaturalSizeAvailable:で、myVideoPlayer.naturalSizeはあなたに必要な値を与え、その後、あなたがビデオを再生することができます。

+1

ありがとう!それは完全に動作します! :) – An1Ba7

32

あなたはこのようAVURLAssetAVAssetTrackを、使用してビデオの寸法を読むことができます:

NSURL *mediaURL; // Your video's URL 
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:mediaURL options:nil]; 
NSArray *tracks = [asset tracksWithMediaType:AVMediaTypeVideo]; 
AVAssetTrack *track = [tracks objectAtIndex:0]; 

その後AVAssetTrackのnaturalSizeプロパティを使用して:

CGSize mediaSize = track.naturalSize; 

こうして動画のメタデータを取得する利点ビデオを再生したり、ロードを待つことなく、すぐにアクセスできるということです。

+0

それは私のために働く。ありがとう。 –

1

私はこのページを見つける人のために自分の経験を共有したいと思っていました。

自然なサイズは実際にはエンコードされた解像度ではなく、ディスプレイの解像度です。これは、例えばピクセルアスペクト比が1であるか、(より一般的な)符号化されたビデオにクリーンアパーチャメタデータ情報がある場合、符号化された解像度とは異なることがある。

私が見つけた唯一の方法は、AVASsetReaderTrackOutputなどで最初のフレームをデコードし、結果のピクセルバッファをCVPixelBufferGetWidth(またはGetHeight)で検査してデータの解像度を取得することです。 imageGeneratorを使用すると、表示解像度(および表示解像度のrgbビットマップ)が得られます

関連する問題