2013-02-07 15 views
19

(Yerel) videonun süresini almalı ve sonra da kendi çerçevelerine UIImage s olarak erişmem gerekiyor. Şimdiye kadar bunun için MPMoviePlayerController kullanıyorum.iOS: video oynatmadan videonun süresini ve küçük resimlerini alın

İlk önce MPMovieDurationAvailableNotification olayı için kayıt yapıyorum ve prepareToPlay numaralı telefonu arayın. Etkinlik alındığında, videonun süresine dikkat ediyorum ve daha sonra requestThumbnailImagesAtTimes üzerinden kareler talep ediyorum.

Bu, ancak videonun hiçbir şekilde görünümüne eklememiş olmama rağmen video oynatmaya başlıyor gibi görünüyor (arka planda çalmakta olan sesi duyabiliyorum).

Videonun gerçekte oynatılmadan videonun süresini ve çerçevelerini almanın bir yolu var mı? Ben açıklama yapmadan downvoted alıyorum, ama bu cevap arkasýndayým:

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

Düzenleme:

+0

gibi hızlı geçebilirsiniz:

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

bir framegrab almak için: – geraldWilliam

+0

Bu sorunla ilgili herhangi bir öneri: https://stackoverflow.com/questions/47617130/error-getting-same-video-thumbnail-image-every-time-in-swift3-ios/47617794#47617794 –

cevap

35

süresini elde etmek için dosya sistemi o zaman bir [AVAsset] olarak erişebilirsiniz (https://developer.apple.com/library/mac/#documentation/AVFo undation/Reference/AVAsset_Class/Reference/Reference.html) assetWithUrl: ve döndürülen AVAsset'in bir süre özelliği vardır. Küçük resimlerden emin değilim.
+0

Bu gerçekten süreyi düzgün şekilde alıyor, teşekkürler. Ancak "bir kare yakala" zamanlaması biraz kapalı gibi görünüyor. CMTimeMakeWithSeconds (offsetInSeconds, 600) kullanmam gerekiyordu. –

+0

frameTime nedir? Ben frameTimeStart görüyorum, bu frameTime olması gerekiyordu? – etayluz

+1

Good catch @etayluz – Shizam

6

MPMoviePlayerController ile hile setShouldAutoPlay:NO gelmez çağrılıyor. MPMoviePlayerController'u kullanmanız gerekiyorsa, bu işlem medyanın otomatik oynatılmasını engeller, ancak yine de orijinal soruma göre süre ve küçük resim elde etmenizi sağlar. Eğer videonuzu depolayacaksanız

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

Otomatik oynatmanın varsayılan olarak TRUE olarak ayarlanması aptalca bir şey mi? – sunny

+1

Cevabınız gerçekten, soruya cevap veriyor; ama 'MPMoviePlayerController' ile yaptığınız şey, istediğiniz bilgiyi almak için ihtiyaç duyulandan daha fazla kaynak kullanan ve gelecekteki iOS sürümlerinde kırılabilecek çirkin bir çözüm olduğundan dolayı oylama yaptığınızı tahmin ediyorum. Sistemin belleğe yüklenmesini ve ihtiyacınız olan her şeyle ilgili bazı meta veriler olduğunda videoyu oynatmaya hazırlanmasını istiyorsunuz. Konu dışı: sadece meraktan, sizi kimin oy kullandığını gösterir mi? Hiç oylanmadım bu yüzden merak ediyorum. – Velociround

8

Bu

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

Lütfen şu adresi kontrol edin: https://stackoverflow.com/questions/47617130/error-getting-same-video-thumbnail-image-every-time-in-swift3-ios –

İlgili konular