2011-02-08 25 views
5

Tôi gặp sự cố khi sử dụng AVURLAsset.AVURLKhông thể tải bằng tập tin từ xa

NSString * const kContentURL = @ 

"http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8"; 
... 

    NSURL *contentURL = [NSURL URLWithString:kContentURL]; 
    AVURLAsset *asset = [AVURLAsset URLAssetWithURL:contentURL 
               options:nil]; 
    [asset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:tracksKey] 
          completionHandler:^{ 
    ... 
           NSError *error = nil; 
           AVKeyValueStatus status = [asset statusOfValueForKey:tracksKey 
                       error:&error]; 
    ... 
    } 

Trong khối hoàn thành, trạng thái là AVKeyValueStatusFailed và thông báo lỗi là "Không thể mở". Tất cả exemples Tôi đã thấy, sử dụng một tập tin địa phương, như vậy có lẽ có một vấn đề sử dụng một tập tin từ xa ...

Kính trọng, Quentin

Trả lời

6

Bạn có thể không trực tiếp tạo ra một AVURLAsset cho một Live HTTP dòng như được nêu trong số AV Foundation Programming Guide của Apple. Bạn sẽ phải tạo một AVPlayerItem với url luồng và nhanh chóng một AVPlayer với nó

AVPlayerItem *pItem = [AVPlayerItem playerItemWithURL:theStreamURL]; 
AVPlayer *player = [AVPlayer playerWithPlayerItem:pItem]; 

Nếu bạn cần phải có quyền truy cập vào các AVURLAsset đằng sau đó bạn có thể làm theo các bước sau.

Bước 1/đăng ký thay đổi của status tài sản của mục chơi

[playerItem addObserver:self forKeyPath:@"status" options:0 context:nil]; 

Bước 2/trong observeValueForKeyPath:ofObject:change:context:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
         change:(NSDictionary *)change context:(void *)context { 
    if ([keyPath isEqualToString:@"status"]) { 
     AVPlayerItem *pItem = (AVPlayerItem *)object; 
     if (pItem.status == AVPlayerItemStatusReadyToPlay) { 
      // Here you can access to the player item's asset 
      // e.g.: self.asset = (AVURLAsset *)pItem.asset; 
     } 
    } 
} 

EDIT: sửa câu trả lời

+0

Cảm ơn, tôi đã thử giải pháp này nhưng phương pháp quan sát trên giá trị currentItem không được gọi vì thuộc tính đã được đặt khi tôi thêm các quan sát er. Vì vậy, tôi đã đặt một phương pháp quan sát về trạng thái của AVPlayerItem, và từ đây tôi đã có thể nhận được AVPlayer currentItem. – Quentin

+0

@Quentin Bạn nói đúng, cảm ơn! Trộn lẫn với một phần khác của mã của tôi ... Tôi đã chỉnh sửa câu trả lời của mình để sửa lại điều đó. – Jilouc

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