AVPlayer HLS实时stream量计(显示FFT数据)

我正在使用AVPlayer进行使用HTTP实况stream的电台应用程序。 现在我想为audiostream实现一个电平表。 最好的方法是用电平表显示不同的频率,但是简单的左/右解决scheme将是一个很好的起点。

我发现了几个使用AVAudioPlayer例子。 但是我找不到一个解决scheme来获取AVPlayer所需的信息。

有人能为我的问题想出一个解决scheme吗?

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

漂亮的水平仪

编辑II

一个build议是使用MTAudioProcessingTap来获取原始audio数据。 使用[[[_player currentItem] asset] tracks]数组可以find这个例子,在我的例子中,它是一个空数组。 另一个build议是使用[[_player currentItem] audioMix]对我来说是null的。

编辑三

已经有好几年了,似乎还没有解决办法。 我确实取得了进展,所以我分享了。

在安装过程中,我将一个键值观察者添加到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]; } 

到现在为止还挺好。 这一切工作,我可以find正确的轨道,并设置inputParams和audioMix等,但不幸的是唯一的callback,被调用是初始化callback。 其他人都不会在任何时候开火。

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

不幸的是,使用AVFoundation的HLSstreamAVFoundation音轨。 我遇到了同样的问题试图静音HLSstream,这是不可能的。

您可以读取audio数据的唯一方法是使用AVAudioSession

编辑

你可以像这样访问AVAudioSession:

 [AVAudioSession sharedInstance] 

这是AVAudioSession的文档

使用AVPlayer测量audio看起来是一个仍在进行中的问题。 这就是说,我相信通过将AVPlayerAVAudioRecorder结合可以达到这个解决scheme。

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

播放器/录音机

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

注意,audiologging必须访问audio路由改变之后开始。 使用链接堆栈答案作为参考 – 它包括更多的细节和必要的代码。

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

一旦访问AVPlayer的audiopath并进行录制, 测量就相对简单明了。

audio级别

在我对有关测量麦克风input的堆栈问题的回答中 ,我描述了访问audio电平测量所需的步骤。 使用AVAudioRecorder来监视音量的变化AVAudioRecorder要复杂的多,所以我包含了一个GitHub 项目 ,这个项目可以在录制的时候监听audio的变化。

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

HLS直播期间的这种组合不是我testing过的。 这个答案是严格的理论上的,所以可能需要对这两个类完全理解。