当前位置: 首页 > 知识库问答 >
问题:

AVPlayer HLS实时流电平计(显示FFT数据)

欧阳意蕴
2023-03-14

我正在使用AVPlayer作为使用HTTP实时流的无线电应用程序。现在我想为该音频流实现一个电平表。最好是一个显示不同频率的电平表,但是一个简单的左/右解决方案将是一个很好的起点。

我发现了几个使用AVAudioPlayer的示例。但是我无法找到从AVPlayer获取所需信息的解决方案。

有人能想出解决我问题的办法吗?

编辑我想创建这样的东西(但更好)

编辑二

一个建议是使用MTAudioProcessingTap来获取原始音频数据。我可以使用[[u player currentItem]asset]tracks]数组找到示例,在我的例子中,数组是一个空数组。另一个建议是使用audioMix,对我来说它是空的。

编辑III

多年过去了,似乎仍然没有解决办法。我确实取得了进步,所以我将与大家分享。

在设置过程中,我将向playerItem添加一个键值观察者:

[[[self player] currentItem] addObserver:self forKeyPath:@"tracks" options:kNilOptions context:NULL];

//////////////////////////////////////////////////////

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)changecontext:(void *)context
    if ([keyPath isEqualToString:@"tracks"] && [[object tracks] count] > 0) {
        for (AVPlayerItemTrack *itemTrack in [object tracks]) {
            AVAssetTrack *track = [itemTrack assetTrack];

            if ([[track mediaType] isEqualToString:AVMediaTypeAudio]) {
                [self addAudioProcessingTap:track];
                break;
            }
        }
}

- (void)addAudioProcessingTap:(AVAssetTrack *)track {
    MTAudioProcessingTapRef tap;
    MTAudioProcessingTapCallbacks callbacks;
    callbacks.version = kMTAudioProcessingTapCallbacksVersion_0;
    callbacks.clientInfo = (__bridge void *)(self);
    callbacks.init = init;
    callbacks.prepare = prepare;
    callbacks.process = process;
    callbacks.unprepare = unprepare;
    callbacks.finalize = finalise;

    // more tap setup...

    AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix];

    AVMutableAudioMixInputParameters *inputParams = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:audioTrack];
    [inputParams setAudioTapProcessor:tap];
    [audioMix setInputParameters:@[inputParams]];

    [[[self player] currentItem] setAudioMix:audioMix];
}

到现在为止,一直都还不错。这一切都是可行的,我可以找到正确的轨迹并设置inputParams和audioMix等。但不幸的是,唯一被调用的回调是init回调。其他人在任何时候都不会开火。

我尝试了不同(种类)的流源,其中之一是Apple HLS官方流:http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8

共有2个答案

戈宏义
2023-03-14

使用AVPlayer测量音频似乎是一个仍在进行的问题。话虽如此,我相信可以通过将AVPlayerAVAudioRecorder相结合来解决问题。

虽然这两个类的目的似乎相互矛盾,但有一种解决方法允许AVAudioRecorder访问AVPlayer的音频输出。

如本堆栈溢出回答中所述,如果您使用kAudioSessionProperty_AudioRouteChange访问音频路由更改,则可以录制AVPlayer的音频。

请注意,必须在访问音频路由更改后开始录音。使用链接的堆栈答案作为参考-它包括更多详细信息和必要的代码。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

一旦您可以访问AVPlayer的音频路由并进行录制,测量就相对简单了。

在我对关于测量麦克风输入的堆栈问题的回答中,我描述了访问音频电平测量所需的步骤。使用AVAudioRecorder来监控音量变化比人们想象的要复杂,所以我包含了一个GitHub项目,作为在录制时监控音频变化的模板。

~~~~~~~~~~~~~~~~~~~~~~~~请注意~~~~~~~~~~~~~~~~~~~~~~~~~~

在HLS直播中的这种组合不是我测试过的。这个答案严格来说是理论上的,所以可能需要对两个类都有很好的理解才能完全解决。

戴嘉珍
2023-03-14

遗憾的是,将HLS流与AVFoundation一起使用并不能控制音频轨迹。我在试图使HLS流静音时遇到了同样的问题,结果证明这是不可能的。

读取音频数据的唯一方法是点击音频会话。

编辑

您可以这样访问AVAudioSession:

[AVAudioSession sharedInstance]

这是AVAudioSession的文档

 类似资料:
  • 本文向大家介绍js倒计时显示实例,包括了js倒计时显示实例的使用技巧和注意事项,需要的朋友参考一下 话不多说,请看实例代码 以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持呐喊教程!

  • 应用程序运行良好...只是数据没有出现...我已经添加了sha用户电子邮件显示在登录后,在登录活动中我已经添加了 但是在实时数据库数据不显示以防万一…我也等了半个小时,尝试了所有的东西…网络也不错。数据库中的数据库规则的数据库图片 mainActivity.java//不能用于单个子级,即firebaseDatabase.getInstance().getReference().child(“aj

  • 主要内容:实例,实例,实例,实例,实例FFT(Fast Fourier Transform),快速傅立叶变换,是一种 DFT(离散傅里叶变换)的高效算法。在以时频变换分析为基础的数字处理方法中,有着不可替代的作用。 FFT 原理 公式推导 DFT 的运算公式为: 其中, 将离散傅里叶变换公式拆分成奇偶项,则前 N/2 个点可以表示为: 同理,后 N/2 个点可以表示为: 由此可知,后 N/2 个点的值完全可以通过计算前 N/2 个点时

  • 我需要在实时调整浏览器大小时获得浏览器的宽度。到目前为止,我已经找到了一个解决方案,它给出了宽度,但它不是实时的。该值仅在刷新网页后更新。如何在调整浏览器大小时获取值。 我的做法 这个解决方案工作,如果我刷新页面。但我想得到的宽度,因为我调整,因为我必须执行一个功能在特定的屏幕尺寸。

  • 问题内容: 我在一堂课(名为“欢迎”)中有一个“状态” JLabel,而在另一堂课(名为Timer)中有一个计时器。现在,第一个显示“状态”一词,第二个应该进行倒计时。我想要的样子,但不知道如何显示10、9、8、7 … 0(然后转到下一个窗口)。到目前为止,我的尝试: 和计时器: 问题答案: 我同意您应该考虑按照Anh Pham使用“ Java”计时器,但是实际上,有几个可用的Timer类,并且出

  • 我在这个网站上用docker compose启动了Spring云数据流。 https://dataflow.spring.io/docs/installation/local/docker/ 我创建了3个应用程序,源,处理器 我跑了 当我运行docker compose-f时/docker编写。yml-f/docker创作普罗米修斯。yml,所有我的容器都按照docker compose中的指定启