2014-05-16 15 views
7

Tôi đang sử dụng AVPlayer để triển khai trình phát video tùy chỉnh trong ứng dụng iOS. Để chơi video từ mạng tôi bố trí một cầu thủ:AVPlayer/AVPlayerItem thông báo cho ứng dụng của tôi về lỗi mạng không thể truy cập như thế nào?

[[AVPlayer alloc] initWithURL:_URL]; 

Tạo một tài sản:

AVURLAsset *asset = [AVURLAsset URLAssetWithURL:self.URL 
options:@{AVURLAssetPreferPreciseDurationAndTimingKey : @(YES)}]; 

tải phím playable không đồng bộ:

NSArray *keys = @[@"playable"]; 
[asset loadValuesAsynchronouslyForKeys:keys completionHandler:^{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     for (NSString *key in keys) { 
      NSError *error; 
      AVKeyValueStatus status = [asset statusOfValueForKey:key error:&error]; 

      if (status == AVKeyValueStatusFailed) { 
       NSLog(@"Failed to load asset key %@ error %@", key, [error localizedDescription]); 
       [self fail]; 
       return; 
      } 
     } 

     if (asset.isPlayable) { 
      [self.player replaceCurrentItemWithPlayerItem:self.playerItem]; 
     } 
     else { 
      [self fail]; 
     } 
    }); 
}]; 

Vấn đề là khi thiết bị có không có kết nối internet hoặc mất gói cao, completionHandler không bao giờ được gọi (thậm chí sau khi đợi vài phút) và vì vậy tôi không có ý tưởng khi nào hiển thị thông báo cho người dùng rằng tải g video không thành công.

Câu hỏi của tôi là:

  1. Am tôi thiếu một cái gì đó/là có một cách tốt hơn để xử lý này?
  2. Tôi có nên cuộn logic hết thời gian chờ của riêng mình hoặc tôi chỉ không bao giờ loadValuesAsynchronouslyForKeys: khi Reachability tin rằng mạng không thể truy cập được.
  3. Các phương pháp hay nhất về AVPlayer và lỗi mạng là gì?

Trả lời

1

Nó chỉ ra rằng điều này có thể được liên quan đến cách tôi đã thử nghiệm. Sử dụng điều hòa Network Link không kích hoạt khối, nhưng khi tôi thực sự chặn máy chủ bằng cách sử dụng Charles Proxy, mọi thứ hoạt động như dự định. Tôi đang cố gắng để đi với mã ban đầu của tôi cho bây giờ, và sẽ thêm vào một số ý tưởng của Dan nếu nó chứng minh được vấn đề vẫn còn trong quá trình thử nghiệm thế giới thực

1

Tôi đã tích hợp AVAsset trước đây nhưng chưa gặp sự cố cụ thể này. Tuy nhiên, đây là những gì tôi sẽ làm:

  1. Đặt hẹn giờ hoặc trì hoãn gửi đi trong khoảng thời gian chờ bạn muốn thực thi.
  2. Kiểm tra giá trị của khóa "có thể phát" với statusOfValueForKey:error:.
  3. Nếu trạng thái không phải là AVKeyValueStatusLoaded hoặc lỗi không phải là số không, hãy gọi [asset cancelLoading] và hiển thị thông báo lỗi cho người dùng hoặc bất kỳ việc dọn dẹp nào bạn có thể cần thực hiện.
4

Bạn nên quan sát (KVO) tính năng của AVPlayerItem tiết lộ như thế nào bộ đệm đang làm, chẳng hạn như playbackBufferEmpty, vv

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