2013-02-07 6 views
19

Ich brauche die Dauer eines (lokalen) Videos und erhalte dann Zugriff auf seine einzelnen Bilder als UIImage s. Bisher habe ich MPMoviePlayerController dafür verwendet.iOS: Videodauer und Thumbnails abrufen, ohne Video abzuspielen

Zuerst registriere ich mich für MPMovieDurationAvailableNotification Ereignisse, und dann rufen Sie prepareToPlay. Wenn das Ereignis empfangen wird, notiere ich die Dauer des Videos, und dann fordere ich Frames über requestThumbnailImagesAtTimes.

Das funktioniert, aber das Video scheint zu spielen, auch wenn ich es nicht in irgendeiner Weise zur Ansicht hinzugefügt habe (ich kann das Audio im Hintergrund hören).

Gibt es eine Möglichkeit, die Dauer und Frames eines Videos zu erhalten, ohne das Video tatsächlich abzuspielen?

+0

erhalten können, wenn Sie Ihr Video sind die Speicherung in Das Dateisystem kann dann als [AVAsset] (https://developer.apple.com/library/mac/#documentation/AVFo Undation/Referenz/AVAsset_Class/Reference/Reference.html) assetWithUrl: und der zurückgegebene AVAsset hat eine duration -Eigenschaft. Nicht sicher über die Thumbnails. – geraldWilliam

+0

Irgendwelche Vorschläge zu diesem Problem: https://stackoverflow.com/questions/47617130/error-getting-same-video-thumbnail-image-every-time-in-swift3-ios/47617794#47617794 –

Antwort

35

die Dauer zu erhalten:

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

eine framegrab Um:

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

Das bekommt tatsächlich die Dauer richtig, danke. Allerdings scheint das "Grab a frame" Timing ein wenig zu sein. Ich musste CMTimeMakeWithSeconds (OffsetInSeconds, 600) verwenden. –

+0

Was ist frameTime? Ich sehe frameTimeStart, soll das frameTime sein? – etayluz

+1

Guten Fang @etayluz – Shizam

6

Aufruf setShouldAutoPlay:NO funktioniert der Trick mit MPMoviePlayerController:

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

Edit: Ich bin ohne Erklärung downvoted bekommen, aber ich werde von dieser Antwort stehen. Wenn Sie MPMoviePlayerController verwenden müssen, dann verhindert dies die automatische Wiedergabe des Mediums, erlaubt Ihnen aber trotzdem, die Dauer und die Miniaturansichten gemäß meiner ursprünglichen Frage zu erhalten.

+0

Ist jemand anderes dem zustimmen Es ist irgendwie albern, Autoplay als Standard auf TRUE gesetzt zu haben? – sunny

+1

Ihre Antwort beantwortet die Frage, äh, Aber ich nehme an, dass Sie abgelehnt werden, weil das, was Sie mit 'MPMoviePlayerController' machen, eine hässliche Problemumgehung ist, die möglicherweise mehr Ressourcen benötigt als benötigt wird, um die gewünschten Informationen zu erhalten. Sie bitten das System, in den Speicher zu laden und das Abspielen des Videos vorzubereiten, wenn Sie nur einige Metadaten dazu benötigen. Off Topic: nur aus Neugier, zeigt es Ihnen, wer Sie gewählt hat? Ich war noch nie gewählt worden, also bin ich neugierig. – Velociround

8

Sie in schnellen wie diese

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

Bitte überprüfen Sie dies: https://stackoverflow.com/questions/47617130/error-getting-same-video-thumbnail-image-every-time-in-swift3-ios –