2010-11-04 28 views
39

Tôi đang cố gắng tải tệp video vào ứng dụng iPad của mình dưới dạng AVURLAsset, sử dụng công cụ tải không đồng bộ để đợi để sẵn sàng. Vấn đề là, khi tôi chạy nó, tôi nhận được một thông báo lỗi "thất bại" chung chung mà tôi không biết phải làm gì với nó. Video hoạt động nếu tôi giao cho một số MPMoviePlayerController, nhưng AVURLAsset dường như từ chối mọi thứ liên quan đến video đó.AVURLNhận từ chối tải video

Code:

asset = [[AVURLAsset alloc] initWithURL:[NSURL URLWithString:[docPath stringByAppendingPathComponent:@"video.mov"]] options:nil]; 
[asset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:@"tracks"] completionHandler:^{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self composeIfReady]; 
    }); 
}]; 

...

- (void)composeIfReady 
{ 
    NSError *error = nil; 
    if([asset statusOfValueForKey:@"tracks" error:&error] == AVKeyValueStatusFailed) 
     NSLog(@"error loading: %@", [error description]); 
    if(error == nil) 
     NSLog(@"okay awesome"); 
} 

Sản lượng:

error loading: Error Domain=AVFoundationErrorDomain Code=-11800 "The operation couldn’t be completed. (AVFoundationErrorDomain error -11800.)" UserInfo=0x1696f0 {NSUnderlyingError=0x169a40 "The operation couldn’t be completed. (OSStatus error -12936.)"} 

-11800, bằng cách này, là mã lỗi cho "không rõ lỗi". Loại chết. Bất kỳ ý tưởng? Có điều gì tôi nên thiết lập trước khi tôi cố gắng tải nội dung không?

Trả lời

110

Đã giải quyết. Bí quyết: sử dụng fileURLWithPath:, không phải URLWithString:. Rõ ràng sự khác biệt thực sự, thực sự quan trọng.

+27

Tôi đang sử dụng tệpURLWithPath và vẫn gặp lỗi tương tự. – gngrwzrd

+0

+1 Điều này phù hợp với tôi .. Cảm ơn rất nhiều .. –

+1

Cảm ơn bạn rất nhiều! Bây giờ tôi nhận ra rằng sự khác biệt là quan trọng bởi vì nó cần một URL tuyệt đối cho tệp và do đó URL tương đối (/ var/mobile/...) do URLWithString cung cấp không hoạt động. –

6

Nếu bất kỳ ai vẫn gặp sự cố với điều này ngay cả sau khi sử dụng tệpURLWithPath, hãy thử yêu cầu NSTimeIntervals trong mảng thời gian nếu bạn đang sử dụng int (s).

này không hoạt động:

NSMutableArray *playbackTimes = [NSMutableArray array]; 
    for (int i = 0; i <= 10; i ++) { 
     [playbackTimes addObject:@(i)]; 
    } 

    [self.videoPlayer requestThumbnailImagesAtTimes:playbackTimes timeOption:MPMovieTimeOptionNearestKeyFrame]; 

này hoạt động:

NSMutableArray *playbackTimes = [NSMutableArray array]; 
    for (int i = 0; i <= 10; i ++) { 
     [playbackTimes addObject:@((NSTimeInterval)i)]; 
    } 

    [self.videoPlayer requestThumbnailImagesAtTimes:playbackTimes timeOption:MPMovieTimeOptionNearestKeyFrame]; 
+0

Đây là vấn đề của tôi. Ed23 –

+0

Bạn có thể tạo phiên bản nhanh chóng này không? Vui lòng – rottenoats

5

Nếu bạn đang sử dụng -[NSURL fileURLWithPath:] để tạo ra các URL và vẫn nhận được lỗi tương tự.

Kiểm tra AVURLAssetReferenceRestrictionsKey, M3u8 cục bộ của bạn có thể không hoạt động nếu nó chứa tài nguyên từ xa.

Đặt giá trị thành @(AVAssetReferenceRestrictionForbidNone) sẽ giải quyết được sự cố.

+1

Bạn đặt mã này ở đâu? – CodyMace

+0

@CodyMace Đó là khóa tùy chọn cho 'AVURLAsset', xem' - [AVURLAsset URLAssetWithURL: options:] ' – naituw