2013-02-07 43 views
19

Tôi cần có thời lượng của video (địa phương) và sau đó truy cập vào các khung riêng lẻ của mình dưới dạng UIImage s. Cho đến nay tôi đã sử dụng MPMoviePlayerController cho việc này.iOS: nhận thời lượng video và hình thu nhỏ mà không cần phát video

Trước tiên, tôi đăng ký MPMovieDurationAvailableNotification sự kiện và sau đó gọi prepareToPlay. Khi nhận được sự kiện, tôi lưu ý thời lượng của video và sau đó tôi yêu cầu khung hình qua requestThumbnailImagesAtTimes.

Tác phẩm này, tuy nhiên video dường như bắt đầu phát ngay cả khi tôi chưa thêm video vào chế độ xem theo bất kỳ cách nào (tôi có thể nghe thấy âm thanh phát trong nền).

Có cách nào để có thời lượng và khung của video mà không thực sự phát video không?

+0

Nếu bạn đang lưu trữ video của bạn trong hệ thống tập tin sau đó bạn có thể truy cập nó như một [AVAsset] (https://developer.apple.com/library/mac/#documentation/AVFo undation/Reference/AVAsset_Class/Reference/Reference.html) assetWithUrl: và AVAsset trả lại có thuộc tính duration. Bạn không chắc chắn về hình thu nhỏ. – geraldWilliam

+0

Bất kỳ đề xuất nào về vấn đề này: https://stackoverflow.com/questions/47617130/error-getting-same-video-thumbnail-image-every-time-in-swift3-ios/47617794#47617794 –

Trả lời

35

Để có được thời gian:

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

Để có được một framegrab:

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

Điều này thực sự có được thời gian đúng cách, cảm ơn bạn. Tuy nhiên, "lấy một khung" thời gian dường như là một chút đi. Tôi đã phải sử dụng CMTimeMakeWithSeconds (offsetInSeconds, 600). –

+0

FrameTime là gì? Tôi thấy frameTimeStart, được cho là frameTime? – etayluz

+1

Bắt tốt @etayluz – Shizam

6

Calling setShouldAutoPlay:NO không lừa với MPMoviePlayerController:

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

Chỉnh sửa: Tôi đang bị downvoted mà không lời giải thích, nhưng tôi sẽ đứng bởi câu trả lời này. Nếu bạn cần sử dụng MPMoviePlayerController thì điều này sẽ ngăn tự động phát phương tiện nhưng vẫn cho phép bạn nhận thời lượng và hình thu nhỏ theo câu hỏi ban đầu của tôi.

+0

Có ai khác đồng ý rằng thật ngớ ngẩn khi đặt tự động phát thành TRUE làm mặc định? – sunny

+1

Câu trả lời của bạn thực sự, uh, trả lời câu hỏi; nhưng tôi đoán bạn sẽ bị bỏ phiếu vì những gì bạn đang làm với 'MPMoviePlayerController' là một giải pháp xấu có thể sử dụng nhiều tài nguyên hơn cần thiết để có được thông tin bạn muốn và có thể phá vỡ trong các bản phát hành iOS trong tương lai. Bạn đang yêu cầu hệ thống tải vào bộ nhớ và chuẩn bị phát video khi tất cả những gì bạn cần là một số siêu dữ liệu về nó. Tắt chủ đề: chỉ vì tò mò, liệu nó có cho bạn biết ai đã bỏ phiếu cho bạn không? Tôi chưa bao giờ bị bỏ phiếu vì vậy tôi tò mò. – Velociround

8

Bạn có thể nhận được trong nhanh chóng như thế này

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

Vui lòng kiểm tra điều này: https://stackoverflow.com/questions/47617130/error-getting-same-video-thumbnail-image-every-time-in-swift3-ios –

Các vấn đề liên quan