我试图在我的应用程序中显示一个仪表图,它使用 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" optionsNSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial) context:nil];
[self.avplayer addObserver:self forKeyPath"rate" optionsNSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial) context:nil];
});
}];
- (void)observeValueForKeyPathNSString *)keyPath ofObjectid)object
changeNSDictionary *)change contextvoid *)context {
NSLog(@"%@ called",keyPath);
if ( [keyPath isEqualToString"status"]) {
[self.avplayer play];
} else if ( [keyPath isEqualToString"rate"]) {
if (self.avplayer.rate) {
NSLog(@"laying...");
[[NSNotificationCenter defaultCenter] postNotificationName"currentPlayingChangedToPlay" object:nil];
} else {
NSLog(@"Not playing...");
[[NSNotificationCenter defaultCenter] postNotificationName"currentPlayingChangedToPause" object:nil];
}
}
}
Best Answer-推荐答案 strong>
通常,您可以通过在播放器项目上使用 MTAudioProcessingTap 来获取 AVPlayer 的音频样本,但是您的 Assets 通过
AVURLAsset 上的 tracks 属性永远不可用
- 当您观察并将水龙头附加到您的
playerItem.tracks 的 assetTrack 时,不会给您回电话。
我从来没有看到一个很好的解释为什么这对远程 mp3 或 m3u8 流不起作用,而且恼人的是,它确实对其他远程 Assets 有效类型,例如 aac 。不公平的是,在视频方面,AVPlayerItemVideoOutput似乎适用于所有类型的 Assets (除非 DRM 问题)!
那么这会给您带来什么影响呢?一种方法是自己从可以使用 AudioQueue 解码和播放的位置流式传输 mp3 数据,并且还使用上述MTAudioProcessingTap计算峰值功率 。涉及 AudioConverter /AudioUnit 和 AVAudioConverter /AVAudioEngine 的解决方案也浮现在脑海中。
如果仅替换单个属性听起来工作量太大,您可以查看预制解决方案,例如 StreamingKit或 FreeStreamer然后计算功率。您可能会找到一个为您计算功率的图书馆。如果不是,您可以使用 this formula 计算 peakPowerForChannel
关于ios - AVPlayer Live stream如何为音频电平计量获取电源,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/39947408/
|