• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - AVPlayer Live stream如何为音频电平计量获取电源

[复制链接]
菜鸟教程小白 发表于 2022-12-12 22:30:34 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

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

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap