2011-05-12 34 views
8

iPhone4, iOS 4.3.3, iOS SDK4.3MPMoviePlayerController - Thời gian luôn 0

Hi all,

tôi là tạo ra một tính năng upload video. Các video được truy xuất bằng UIImagePickerController và có thể được chụp bằng camera hoặc được chọn từ thư viện ảnh. Tôi có giới hạn ứng dụng trong thời lượng tối đa 60 giây. Đây có thể dễ dàng đạt được khi quay video bằng máy ảnh thông qua:

// Giới hạn video đến 60 giây

[chọn setVideoMaximumDuration: 60];

Tuy nhiên khi video được chọn từ thư viện ảnh cách duy nhất tôi thấy có được trong suốt thời gian qua là bất động sản thời gian MPMoviePlayerController như sau:

// MediaType có thể kUTTypeImage hoặc kUTTypeMovie.

NSString * mediaType = [info objectForKey: UIImagePickerControllerMediaType]; NSLog (@ "% @", loại phương tiện);

// nếu nó một bộ phim

if ([mediaType isEqualToString:(NSString*)kUTTypeMovie]) { 

    // get the URL 
    NSURL* mediaURL = [info objectForKey:UIImagePickerControllerMediaURL]; 
    NSLog(@"%@",mediaURL); 

    // can use MPMoviePlayerController class to get duration 
    int duration = -1; 
    MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL: mediaURL]; 
    if (moviePlayer != nil) { 

     duration = moviePlayer.duration; 
     NSString *path = moviePlayer.contentURL; 

     [moviePlayer release]; 
    } 

tuy nhiên thời gian luôn là 0. Tôi biết các video có thời gian vì thời gian sẽ được hiển thị như một phần của phụ đề khi lựa chọn nó trong thư viện ảnh. Tôi hiểu rằng thời lượng có thể không phải lúc nào cũng có sẵn nhưng trong trường hợp này thời lượng được hiển thị trong lib ảnh. Tôi cũng kiểm tra thuộc tính contentURL và nó có giá trị tốt. Tôi có thể truy xuất tệp, nhận tệp của nó v.v. vì vậy tôi biết NSURL của tệp là tốt ...

Cảm ơn!

+1

Bạn có thể lắng nghe cho MPMovieDurationAvailableNotification. Điều đó sẽ đòi hỏi bạn phải giữ cho moviePlayer xung quanh đủ lâu để có thể xác định thời lượng. Thư viện ảnh có thể sử dụng giá trị được lưu trong bộ nhớ cache. – omz

+0

@imobilizer Nếu câu trả lời dưới đây giúp, vui lòng đánh dấu là được chấp nhận. – memmons

Trả lời

16

Tôi không thấy bất kỳ điều gì xảy ra với mã của bạn ngay lập tức. Tuy nhiên, việc sử dụng AVFoundation nhanh hơn nhiều cho loại thao tác này. Dưới đây là một đoạn mã để có được thời gian sử dụng AVFoundation:

AVURLAsset *asset = [[[AVURLAsset alloc] initWithURL:anURI 
         options:[NSDictionary dictionaryWithObjectsAndKeys: 
         [NSNumber numberWithBool:YES], 
         AVURLAssetPreferPreciseDurationAndTimingKey, 
         nil]] autorelease]; 

NSTimeInterval durationInSeconds = 0.0; 
if (asset) 
    durationInSeconds = CMTimeGetSeconds(asset.duration) ; 
+0

Cảm ơn Harkonian, thật ra mã này không hoạt động được. – imobilizer

+0

Cảm ơn @Harkonian, thực sự mã này đã không làm việc staight đi như có một con trỏ không hợp lệ để cảnh báo chuyển đổi số nguyên và whn tôi chạy nó một dòng để lấy thời gian nhận được SIGABRT sau khi ném NSException. Sau khi ASSET được tạo, tôi cần lấy thời lượng như sau: CMTime assetTime = [duration duration]; Thời lượng float64 = CMTimeGetSeconds (assetTime); – imobilizer

+0

Khắc phục: Thời lượng NSTimeInterval = 0,0; if (asset) duration = CMTimeGetSeconds (asset.duration); – konradowy

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