2012-02-15 13 views
11

Tôi đang cố gắng để tạo ra hình thu nhỏ cho các tập tin video:Có thể làm cho AVURLAsset hoạt động mà không có phần mở rộng tệp không?

- (UIImage*) thumbnailForVideoAtURL: (NSURL*) videoURL 
{ 
    AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoURL options:nil]; 
    AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset]; 
    CGImageRef imageHandle = [generator copyCGImageAtTime:kCMTimeZero actualTime:NULL error:NULL]; 
    if (imageHandle) { 
     UIImage *frameImage = [UIImage imageWithCGImage:imageHandle]; 
     CFRelease(imageHandle); 
     return frameImage; 
    } else { 
     return nil; 
    } 
} 

Việc nắm bắt được rằng các tập tin video được lưu trữ trong một content-addressable store và không có phần mở rộng. Điều này dường như ném AVURLAsset tắt, như tài sản được tạo ra, nhưng khi đọc những hình ảnh khung tôi nhận được lỗi sau:

Error Domain=AVFoundationErrorDomain Code=-11828 "Cannot Open" UserInfo=0x167170 {NSLocalizedFailureReason=This media format is not supported., NSUnderlyingError=0x163a00 "The operation couldn’t be completed. (OSStatus error -12847.)", NSLocalizedDescription=Cannot Open} 

Đây có phải là tài liệu hoặc đề cập ở đâu đó? Tôi không thể tin rằng tôi thực sự buộc phải chuyển thông tin định dạng tệp thông qua tên tệp. Đối số options cho trình khởi tạo AVURLAsset trông giống như một nơi tốt để cung cấp loại tệp, nhưng theo tài liệu thì dường như không có bất kỳ hỗ trợ nào cho điều đó.

PS. Tôi đã thử nghiệm mã, cùng một tệp với phần mở rộng chính xác sẽ tạo ra hình thu nhỏ tốt.

Trả lời

10

Cuối cùng, tôi tạm thời tạo liên kết cứng tới tệp và cung cấp phần mở rộng chính xác cho liên kết cứng. Đó là một hack mặc dù, tôi muốn nhìn thấy một giải pháp tốt hơn. Tôi đã submitted a bug report chống lại AVURLAsset, hy vọng Apple có thể thêm tính năng này để đọc thông tin định dạng tệp từ từ điển options.

+0

Bạn có thể cho tôi biết plz hay không. rằng làm thế nào u tạo liên kết cứng đến tập tin, thực sự tôi có một url video ống bạn và tôi phải tạo hình thu nhỏ của video đó bằng url của nó –

+0

Ý của bạn là URL tệp cục bộ hoặc URL YouTube HTTP thông thường? URL tệp cục bộ có thể dễ dàng được liên kết cứng bằng cách sử dụng '[NSFileManager linkItemAtURL: toURL: error:]'. Tạo hình thu nhỏ từ URL video YouTube trên YouTube xứng đáng là [câu hỏi riêng] (http://stackoverflow.com/questions/ask), IMHO. – zoul

+1

Vẫn không cố định trong iOS7 và '[[Phân bổ AVAudioPlayer] initWithContentsOfURL: url url: nil];' không có vấn đề với các tệp không có phần mở rộng –

3

câu trả lời Swift:

let filePath = ###YOU SET THIS### 
let fileManager = NSFileManager.defaultManager() 
let documentsURL = fileManager.URLsForDirectory(.DocumentDirectory, inDomains: .AllDomainsMask).last! 
let tmpURL = documentsURL.URLByAppendingPathComponent("tmp.caf") 
_ = try? fileManager.removeItemAtURL(tmpURL) 
_ = try? fileManager.linkItemAtURL(fileURL, toURL: tmpURL) 

Hoàn thành câu trả lời obj-C:

NSString *filePath = ###YOU SET THIS### 
NSFileManager *dfm = [NSFileManager defaultManager]; 
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); 
NSString *tmpPath = [[documentPaths lastObject] stringByAppendingPathComponent:@"tmp.caf"]; 
[dfm removeItemAtPath:tmpPath error:nil]; 
[dfm linkItemAtPath:filePath toPath:tmpPath error:nil]; 

Và bây giờ AVURLAsset sẽ làm việc với tmpPath.

+0

Hey .. cách tiếp cận tương tự hoạt động trong trường hợp PHAsset .. Tôi không thể đọc tệp cục bộ theo đường dẫn được tìm nạp từ PHAsset.do đó việc liên kết hoạt động – ProblemSlover

4

Tôi tin rằng tôi đã tìm thấy giải pháp thay thế trong iOS7. Bí quyết là sử dụng AVAssetResourceLoader. Chuyển vào AVURLCài đặt URL giả chứa một lược đồ do bạn tạo, điều này sẽ khiến AVAssetResourceLoaderDelegate được gọi là e.g. 'myscheme: //random.com/file.mp4' Như bạn có thể thấy với URL mà tôi tạo nó có phần mở rộng .mp4, điều này sẽ cho phép AVPlayer mở đúng tệp, miễn là bạn làm theo bước tiếp theo một cách chính xác .

Bây giờ hãy triển khai AVAssetResourceLoaderDelegate để sử dụng URL thực tế tức là 'http://actual.com/file' Dữ liệu giờ đây sẽ được chuyển tới AVPlayer một cách chính xác mà không phàn nàn về việc không thể mở loại định dạng tệp đó.

+1

Tôi đang làm việc để triển khai giải pháp được đề xuất của bạn và tôi đang triển khai AVAssetResourceLoaderDelegate, nhưng tôi vẫn không thể tải AVPlayer để phát nguồn âm thanh. Bạn có thể giải thích về ý nghĩa của bạn bằng cách "Bây giờ triển khai AVAssetResourceLoaderDelegate để sử dụng URL thực tế tức là 'http://actual.com/file'" không? Bạn đang trao đổi các URL bằng cách nào đó? – Shackleford

+1

Tôi đã làm điều này một thời gian trước đây, nhưng về cơ bản tôi đã sử dụng một lược đồ tài nguyên với phần mở rộng .mp4 để đại biểu sẽ được gọi và không bị bỏ qua. Khi bên trong ủy nhiệm đó, tôi đã sử dụng địa chỉ tài nguyên thực sự để tải nó, tôi đã sử dụng một phương thức tĩnh để lấy địa chỉ tài nguyên thực thay vì sử dụng địa chỉ dummy cần thiết để đại biểu được gọi chính xác. – Pellet