2016-10-09 8 views
2

AVPlayerを使用してライブオーディオストリームをストリームするアプリケーションにメーターグラフを表示しようとしています。AVPlayerライブストリームオーディオレベルメータリングの電源を取得する方法

私は、あたりなどの方法がありAVAudioPlayerのために知っている: Trying to understand AVAudioPlayer and audio level metering

peakPowerForChannel

を使用しています。しかしAVAudioPlayerは、オーディオストリームのために動作しません。

AVPlayerに類似したものはありますか?それともAVPlayerからパワー値を得ることができる他の方法はありますか?

コード:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; 
    if (self.avplayer) { 
     [self.avplayer replaceCurrentItemWithPlayerItem:nil]; 
    } 
    AVURLAsset *avAsset = [[AVURLAsset alloc] initWithURL:[NSURL URLWithString:@"http://broadcast.infomaniak.net/radionova-high.mp3"] options:nil]; 
    NSArray *keys = @[@"playable"]; 
    [avAsset loadValuesAsynchronouslyForKeys:keys completionHandler:^{ 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      AVPlayerItem *newItem = [[AVPlayerItem alloc] initWithAsset:avAsset]; 
      if (!self.avplayer) { 
       self.avplayer = [[AVPlayer alloc] initWithPlayerItem:newItem]; 
      } else { 
       [self.avplayer replaceCurrentItemWithPlayerItem:newItem]; 
      } 
      [self.avplayer addObserver:self forKeyPath:@"status" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial) context:nil]; 
      [self.avplayer addObserver:self forKeyPath:@"rate" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial) context:nil]; 
     }); 
    }]; 

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
         change:(NSDictionary *)change context:(void *)context { 
    NSLog(@"%@ called",keyPath); 
    if ([keyPath isEqualToString:@"status"]) { 
     [self.avplayer play]; 
    } else if ([keyPath isEqualToString:@"rate"]) { 
     if (self.avplayer.rate) { 
      NSLog(@"Playing..."); 
      [[NSNotificationCenter defaultCenter] postNotificationName:@"currentPlayingChangedToPlay" object:nil]; 

     } else { 
      NSLog(@"Not playing..."); 
      [[NSNotificationCenter defaultCenter] postNotificationName:@"currentPlayingChangedToPause" object:nil]; 
     } 
    } 

} 
+0

を使用して計算することができます。https://github.com/akhilcb/ACBAVPlayerExtension – adev

答えて

2

通常、あなたはプレーヤーの項目にMTAudioProcessingTapを使用してAVPlayerのオーディオサンプルで取得することができ、しかし、あなたの資産が上tracksプロパティ

  1. を介してこれを抵抗しますあなたのAVURLAssetは決して利用可能になりません
  2. あなたがあなたのplayerItem.tracksassetTrack

は、私は、これは、リモートmp3のかm3u8ストリームのために動作しない理由のために良い説明を見たことがない、とうるさく、それはaacのように、他のリモート資産タイプのための作業を行います。不当にも、ビデオ側では、AVPlayerItemVideoOutputはあらゆる種類の資産(DRMの問題を除く)で機能するようです。

だからどこがあなたを去りますか? 1つの方法は、AudioQueueでもを使ってデコードして再生できる場所からmp3データを自分でストリームすることです。前述のMTAudioProcessingTapを使用してピーク電力を計算します。 AudioConverter/AudioUnitおよびAVAudioConverter/AVAudioEngineを含む解決策も同様に思い浮かぶ。

1つのプロパティを置き換えるだけの場合は、StreamingKitまたはFreeStreamerのようなプリベーク済みのソリューションを見て、消費電力を計算することができます。あなたのために力を計算するライブラリがあります。そうでない場合はpeakPowerForChannelを使用してthis formula

関連する問題