5

AVPlayerViewController クラスでコンテンツを再生できるのに、再生コントロールを表示できないのはなぜですか? プレーヤーは期待どおりにコンテンツをロードしますが、それだけです。

私の MediaPlayerViewController.m クラスには、次のものがあります。

#pragma mark - Player
- (void)setupPlayer{

    // Sample URLs to use either a local file or streaming URL
    NSURL *url = [[NSBundle mainBundle] URLForResource:@"Besan" withExtension:@"mp4"];
    //url = [NSURL URLWithString:@"http://www.youtube.com/watch?v=qcI2_v7Vj2U"];

    // Create an instance of the AVPlayer object
    self.player = [AVPlayer playerWithURL:url];


    // Keep an eye on the status of our player
    [self.player addObserver:self forKeyPath:@"status" options:0 context:nil];
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{

    if (object == self.player && [keyPath isEqualToString:@"status"]) {
        if (self.player.status == AVPlayerStatusFailed){
            NSLog(@"AVPlayer setup failed");
        } else if (self.player.status == AVPlayerStatusReadyToPlay) {
            NSLog(@"AVPlayer is ready to play");
            [self.player play];
        }
    }
}
4

3 に答える 3

13

これはフレームワークのバグではありませんが、キー値の監視が機能する方法に関連しています。実装することで

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

ViewController では、AVPlayerViewController の実装をオーバーライドしています。解決策は、オブザーバーを登録するときにコンテキストを追加することです。

static NSString* const AVPlayerStatusObservationContext = @"AVPlayerStatusObservationContext";

次に、このようにオブザーバーを登録します

[self.player addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionPrior context:(__bridge void *)(AVPlayerStatusObservationContext)];

そしてobserveValueForKeyPathで次のことを行います

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{

    if (context == (__bridge void *)(AVPlayerStatusObservationContext))
    {
        NSLog(@"Change Object %@, Value %@",object,change);
    } else {
        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
    }
}
于 2015-03-20T17:21:25.203 に答える
4

質問へのコメントで指摘したよう- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context に、 AVPlayerViewControllerに実装するとコントロールが消えます。空の実装にすることができます。プレーヤー コントロールは表示されません。これはフレームワークのバグに違いありません。Apple がこれを見つけられなかったことにショックを受けました (ショックです!)。

私の解決策は、オブザーバーを別のクラスに実装することです。NSObject から継承した VideoObserver クラスを作成し、次のように設定しました。

@implementation VideoObserver

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if ([keyPath isEqualToString:@"status"]) {
        NSLog(@"Change: %@", change);
    }
}
@end

AVPlayerViewController で、オブザーバーをプロパティとして設定し、それを使用して監視を開始します。

self.observer = [VideoObserver new];

NSURL * videoURL = [NSURL URLWithString:@"http://www.quirksmode.org/html5/videos/big_buck_bunny.mp4"];
self.videoPlayer = [AVPlayer playerWithURL:videoURL];

[self.videoPlayer addObserver:self.observer forKeyPath:@"status" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial context:nil];

デモ プロジェクトを Github に投稿しました。

于 2014-12-09T19:16:52.980 に答える
0

おかしいかもしれませんが、コントロールが実際に TabBar の下に隠れていないことを確認してください。それに対する解決策はまだ見つかっていませんが、その小さなことが私に悲しみを与え、気付くのに少し時間がかかりましたが、コントロールは実際にはまだそこにありました.

于 2015-03-14T21:58:54.513 に答える