2011-02-08 2 views
5

AVURLAssetを使用しているときに問題があります。AVURLAssetでリモートファイルを読み込めません

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]; 
    ... 
    } 

完了ブロックでは、ステータスはAVKeyValueStatusFailedであり、エラーメッセージは「Can not Open」です。私が見てきたすべてのexemples、ので、多分、リモートファイルを使用して問題があり、ローカルファイルを使用して...あなたは直接としてHTTPライブストリームのためAVURLAssetを作成することはできません

よろしく、 クエンティン

答えて

6

AppleのAV Foundation Programming Guideに記載されています。 あなたは、ストリームのURLでAVPlayerItemを作成し、次の手順を実行することができ、その背後にあるAVURLAssetにアクセスする必要がある場合は、それ

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

でAVPlayerをインスタンス化する必要があります。

ステップ1 /プレーヤーアイテムのstatusプロパティの変更の登録

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

ステップ2/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には:答えに

+0

感謝を修正し、Iこの解決策を試しましたが、オブザーバを追加するとプロパティが既に設定されているため、currentItem値のオブザーバメソッドは呼び出されませんエル。だから私はAVPlayerItemの状態についてオブザーバーメソッドを配置し、ここから私はAVPlayerのcurrentItemを取得することができました。 – Quentin

+0

@クエンティンあなたは正しいです、ありがとう!私のコードの別の部分と混在...私はそれを修正するために私の答えを編集しました。 – Jilouc

関連する問題