我试图在我的应用程序中显示一个仪表图,它使用 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];
}
}
}
通常,您可以通过在播放器项目上使用 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/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |