OStack程序员社区-中国程序员成长平台

标题: ios - AVPlayer Live stream如何为音频电平计量获取电源 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-12 22:30
标题: ios - AVPlayer Live stream如何为音频电平计量获取电源

我试图在我的应用程序中显示一个仪表图,它使用 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-推荐答案


通常,您可以通过在播放器项目上使用 MTAudioProcessingTap 来获取 AVPlayer 的音频样本,但是您的 Assets 通过

  1. AVURLAsset 上的 tracks 属性永远不可用
  2. 当您观察并将水龙头附加到您的 playerItem.tracksassetTrack 时,不会给您回电话。

我从来没有看到一个很好的解释为什么这对远程 mp3m3u8 流不起作用,而且恼人的是,它确实对其他远程 Assets 有效类型,例如 aac。不公平的是,在视频方面,AVPlayerItemVideoOutput似乎适用于所有类型的 Assets (除非 DRM 问题)!

那么这会给您带来什么影响呢?一种方法是自己从可以使用 AudioQueue 解码和播放的位置流式传输 mp3 数据,并且使用上述MTAudioProcessingTap。涉及 AudioConverter/AudioUnitAVAudioConverter/AVAudioEngine 的解决方案也浮现在脑海中。

如果仅替换单个属性听起来工作量太大,您可以查看预制解决方案,例如 StreamingKitFreeStreamer然后计算功率。您可能会找到一个为您计算功率的图书馆。如果不是,您可以使用 this formula 计算 peakPowerForChannel

关于ios - AVPlayer Live stream如何为音频电平计量获取电源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39947408/






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4