(m3uの遠隔ファイルから)ライブオーディオをストリーミングする必要があるアプリを開発しており、ライブストリームが「オンエア」か「オフエア」かを確認する方法を探しています。オーディオプレーヤーはを使用しAVPlayer
ます。
宿題を作ったのですが、その件については何も見つかりませんでした...
どうもありがとう...
(m3uの遠隔ファイルから)ライブオーディオをストリーミングする必要があるアプリを開発しており、ライブストリームが「オンエア」か「オフエア」かを確認する方法を探しています。オーディオプレーヤーはを使用しAVPlayer
ます。
宿題を作ったのですが、その件については何も見つかりませんでした...
どうもありがとう...
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];
}
}
メソッドのスコープで宣言されていないメソッドで使用されるすべての変数はグローバルです。これがお役に立てば幸いです。