2013-02-07 19 views
19

(ローカル)ビデオの再生時間を取得し、個々のフレームにUIImage秒でアクセスする必要があります。これまで私はMPMoviePlayerControllerを使っていました。iOS:ビデオを再生せずにビデオの再生時間とサムネイルを取得する

最初にMPMovieDurationAvailableNotificationイベントに登録してから、prepareToPlayを呼び出します。イベントが受信されると、ビデオの再生時間を記録してから、requestThumbnailImagesAtTimesでフレームを要求します。

これはうまくいきますが、私はそれをビューに何も追加していないにもかかわらず、ビデオが再生を開始しているようです(バックグラウンドで再生されているオーディオを聞くことができます)。

実際に動画を再生せずに動画の再生時間とフレームを取得する方法はありますか?

moviePlayerController = [[MPMoviePlayerController alloc] initWithContentURL: movieURL]; 
[moviePlayerController setShouldAutoplay:NO]; 
[moviePlayerController prepareToPlay]; 

編集:setShouldAutoPlay:NOを呼び出す

+0

よう迅速に取得することができますファイルシステムは、[AVAsset](https://developer.apple.com/library/mac/#documentation/AVFo)としてアクセスできます。 undation/Reference/AVAsset_Class/Reference/Reference.html)assetWithUrl:返されたAVAssetにはdurationプロパティがあります。しかしサムネイルについてはわからない。 – geraldWilliam

+0

この問題に関する提案:https://stackoverflow.com/questions/47617130/error-getting-same-video-thumbnail-image-every-time-in-swift3-ios/47617794#47617794 –

答えて

35

期間取得するには:framegrabを取得するには

NSURL *sourceMovieURL = [NSURL fileURLWithPath:somePath]; 
AVURLAsset *sourceAsset = [AVURLAsset URLAssetWithURL:sourceMovieURL options:nil]; 
CMTime duration = sourceAsset.duration; 

を:

AVAssetImageGenerator* generator = [AVAssetImageGenerator assetImageGeneratorWithAsset:destinationAsset]; 

//Get the 1st frame 3 seconds in 
int frameTimeStart = 3; 
int frameLocation = 1; 

//Snatch a frame 
CGImageRef frameRef = [generator copyCGImageAtTime:CMTimeMake(frameTimeStart,frameLocation) actualTime:nil error:nil]; 
+0

これは本当に期間を正しく取得します、ありがとうございます。しかし、「フレームをつかむ」というタイミングは少しずれているようです。 CMTimeMakeWithSeconds(offsetInSeconds、600)を使用する必要がありました。 –

+0

frameTimeとは何ですか?私はframeTimeStartを参照して、それはframeTimeになっていますか? – etayluz

+1

良いキャッチ@etayluz – Shizam

6

はMPMoviePlayerControllerとのトリックを行います私が説明もなくdownvoted取得していますが、私はこの答えによって立つでしょう。 MPMoviePlayerControllerを使用する必要がある場合は、メディアの自動再生を防ぎますが、オリジナルの質問に従って再生時間とサムネイルを表示することができます。

+0

他に誰かが同意しますか?自動再生をデフォルトとしてTRUEに設定することは馬鹿げていますか? – sunny

+1

あなたの答えは確かに、質問に答えます。 'MPMoviePlayerController'でやっていることは、あなたが望む情報を得るのに必要なリソースよりも多くのリソースを使用する醜い回避策であり、将来のiOSリリースでは壊れる可能性があるからです。システムにメモリにロードし、必要なときにビデオの再生を準備するように要求しています。メタデータがあればそれだけです。 トピックオフ:好奇心の外に、誰があなたに投票したかを示していますか?私は決して投票していないので、私は興味があります。 – Velociround

8

あなたがあなたの動画を保存している場合あなたがこの

func getMediaDuration(url: NSURL!) -> Float64{ 
    let asset : AVURLAsset = AVURLAsset(URL: url) as AVURLAsset 
    let duration : CMTime = asset.duration 
    return CMTimeGetSeconds(duration) 
} 
+0

これを確認してください:https://stackoverflow.com/questions/47617130/error-getting-same-video-thumbnail-image-every-time-in-swift3-ios –

関連する問題