我正在使用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
使用AVPlayer
测量音频似乎是一个仍在进行的问题。话虽如此,我相信可以通过将AVPlayer
与AVAudioRecorder
相结合来解决问题。
虽然这两个类的目的似乎相互矛盾,但有一种解决方法允许AVAudioRecorder访问AVPlayer的音频输出。
如本堆栈溢出回答中所述,如果您使用kAudioSessionProperty_AudioRouteChange
访问音频路由更改,则可以录制AVPlayer的音频。
请注意,必须在访问音频路由更改后开始录音。使用链接的堆栈答案作为参考-它包括更多详细信息和必要的代码。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
一旦您可以访问AVPlayer
的音频路由并进行录制,测量就相对简单了。
在我对关于测量麦克风输入的堆栈问题的回答中,我描述了访问音频电平测量所需的步骤。使用AVAudioRecorder
来监控音量变化比人们想象的要复杂,所以我包含了一个GitHub项目,作为在录制时监控音频变化的模板。
~~~~~~~~~~~~~~~~~~~~~~~~请注意~~~~~~~~~~~~~~~~~~~~~~~~~~
在HLS直播中的这种组合不是我测试过的。这个答案严格来说是理论上的,所以可能需要对两个类都有很好的理解才能完全解决。
遗憾的是,将HLS流与AVFoundation一起使用并不能控制音频轨迹。我在试图使HLS流静音时遇到了同样的问题,结果证明这是不可能的。
读取音频数据的唯一方法是点击音频会话。
编辑
您可以这样访问AVAudioSession:
[AVAudioSession sharedInstance]
这是AVAudioSession的文档
本文向大家介绍js倒计时显示实例,包括了js倒计时显示实例的使用技巧和注意事项,需要的朋友参考一下 话不多说,请看实例代码 以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持呐喊教程!
主要内容:实例,实例,实例,实例,实例FFT(Fast Fourier Transform),快速傅立叶变换,是一种 DFT(离散傅里叶变换)的高效算法。在以时频变换分析为基础的数字处理方法中,有着不可替代的作用。 FFT 原理 公式推导 DFT 的运算公式为: 其中, 将离散傅里叶变换公式拆分成奇偶项,则前 N/2 个点可以表示为: 同理,后 N/2 个点可以表示为: 由此可知,后 N/2 个点的值完全可以通过计算前 N/2 个点时
应用程序运行良好...只是数据没有出现...我已经添加了sha用户电子邮件显示在登录后,在登录活动中我已经添加了 但是在实时数据库数据不显示以防万一…我也等了半个小时,尝试了所有的东西…网络也不错。数据库中的数据库规则的数据库图片 mainActivity.java//不能用于单个子级,即firebaseDatabase.getInstance().getReference().child(“aj
我需要在实时调整浏览器大小时获得浏览器的宽度。到目前为止,我已经找到了一个解决方案,它给出了宽度,但它不是实时的。该值仅在刷新网页后更新。如何在调整浏览器大小时获取值。 我的做法 这个解决方案工作,如果我刷新页面。但我想得到的宽度,因为我调整,因为我必须执行一个功能在特定的屏幕尺寸。
问题内容: 我在一堂课(名为“欢迎”)中有一个“状态” 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中的指定启