【问题标题】:AVPlayer Live stream how to get power for audio level meteringAVPlayer 直播如何为音频电平表供电
【发布时间】:2016-10-09 19:03:56
【问题描述】:

我正在尝试在我的应用程序中显示一个仪表图,该应用程序使用 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];
        }
    }

}

【问题讨论】:

标签: ios iphone audio avaudioplayer avplayer


【解决方案1】:

通常,您可以通过在播放器项目上使用 MTAudioProcessingTap 来获取 AVPlayer 的音频样本,但是您的资产会通过这种方式抵抗

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

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

那么这会给你带来什么影响?一种方法是自己流式传输 mp3 数据,您可以使用AudioQueue 对其进行解码和播放,使用上述MTAudioProcessingTap 计算峰值功率。我也想到了涉及AudioConverter/AudioUnitAVAudioConverter/AVAudioEngine 的解决方案。

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

【讨论】:

    猜你喜欢
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多