1

(m3uの遠隔ファイルから)ライブオーディオをストリーミングする必要があるアプリを開発しており、ライブストリームが「オンエア」か「オフエア」かを確認する方法を探しています。オーディオプレーヤーはを使用しAVPlayerます。

宿題を作ったのですが、その件については何も見つかりませんでした...

どうもありがとう...

4

1 に答える 1

2

AVPlayerとAVPlayerItemを使用している場合は、以下のメソッドのようなオブザーバーを追加します。

-(void) addMediaObservers {
    [_playerItem addObserver:self forKeyPath:@"player_buffer_empty" options:0 context:@"player_buffer_empty"];
    [_playerItem addObserver:self forKeyPath:@"item_status" options:0 context:@"item_status"];

    [_player addObserver:self forKeyPath:@"player_status" options:0 context:@"player_status"];
}

ストリーミングを停止するとき、またはdeallocメソッドで、これらのオブザーバーを削除することを忘れないでください。

- (void)stop
{
    [_playerItem removeObserver:self forKeyPath:@"player_buffer_empty"];
    [_playerItem removeObserver:self forKeyPath:@"item_status"];
    [_player removeObserver:self forKeyPath:@"player_status"];
}

以下の方法で、オーディオストリーミングを管理します。

- (void)observeValueForKeyPath:(NSString *)keyPath
                  ofObject:(id)object
                    change:(NSDictionary *)change
                   context:(void *)context
{
    if (context && ([context isEqualToString:@"item_status"] || [context isEqualToString:@"player_status"] || [context isEqualToString:@"player_buffer_empty"]))
    {
        [self checkStatus];
    }
}

- (void)checkStatus
{
    AVPlayerItemStatus ps = _playerItem && _playerItem.status ? _playerItem.status : AVPlayerItemStatusUnknown;
    AVPlayerStatus s = _player && _player.status ? _player.status : AVPlayerStatusUnknown;

    BOOL isReady = ps == AVPlayerItemStatusReadyToPlay && s == AVPlayerStatusReadyToPlay;

    if (_isPlaying) {
        if (!_isLoading && _player && _playerItem && _playerItem.playbackBufferEmpty) {
            _isLoading = YES;
            [self performSelector:@selector(unpause) withObject:nil afterDelay:20];
        }
        if (!isReady)
            [self stop];
    } else {
        if (isReady)
            [self play];
    }
}

メソッドのスコープで宣言されていないメソッドで使用されるすべての変数はグローバルです。これがお役に立てば幸いです。

于 2012-06-11T15:34:57.873 に答える