2016-10-09 3 views
2

AVPlayer를 사용하여 라이브 오디오 스트림을 스트리밍하는 응용 프로그램에 미터 그래프를 표시하려고합니다. peakPowerForChannelAVPlayer 라이브 스트림 오디오 레벨 미터링에 전원을 공급하는 방법

를 사용하지만 AVAudioPlayer 오디오 스트림이 작동하지 않습니다 Trying to understand AVAudioPlayer and audio level metering

: 나는 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

, 당신은 그러나 당신의 자산

  1. tracks 재산에 통해 저항, 플레이어 상품에 MTAudioProcessingTap를 사용하여 AVPlayer의 오디오 샘플을 얻을 수 있습니다 귀하의 AVURLAsset이 사용 가능하지 않을 것입니다
  2. playerItem.tracks의 0을 관찰하고 첨부 할 때 다시 전화하지 않습니다..

나는이 원격 mp3의 또는 m3u8 스트림 작동하지 않는 이유에 대한 좋은 설명을 본 적이, 그리고 성가 시게, 그것은 aac 같은 다른 원격 자산 유형에 대한 작업을 수행합니다. 부당하게도 동영상 측면에서 AVPlayerItemVideoOutput은 모든 유형의 자산 (DRM 문제 제외)에서 작동하는 것처럼 보입니다!

그렇다면 어디에서 떠나나요? 한 가지 방법은 AudioQueue을 사용하여 디코딩하고 재생할 수있는 mp3 데이터를 직접 스트리밍하는 것이며, MTAudioProcessingTap을 사용하여 최대 전력을 계산합니다. AudioConverter/AudioUnitAVAudioConverter/AVAudioEngine과 관련된 솔루션도 염두에 두어야합니다.

하나의 속성을 대체하기에는 너무 많은 작업 인 것처럼 들리면 StreamingKit 또는 FreeStreamer과 같은 사전 구운 솔루션을 살펴본 다음 전력을 계산할 수 있습니다. 당신은 당신을 위해 힘을 계산하는 라이브러리를 찾을 수 있습니다. 그렇지 않은 경우 peakPowerForChannel을 사용하여 계산할 수 있습니다. this formula