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看起来是一个仍在进行中的问题。 这就是说,我相信通过将AVPlayer
与AVAudioRecorder
结合可以达到这个解决scheme。
虽然这两个类似乎有矛盾的目的,但有一个解决方法,允许AVAudioRecorder
访问AVPlayer
的audio输出。
播放器/录音机
如本堆栈溢出应答中所述 ,如果使用kAudioSessionProperty_AudioRouteChange
访问audio路由更改,则可以录制AVPlayer的audio 。
注意,audiologging必须在访问audio路由改变之后开始。 使用链接堆栈答案作为参考 – 它包括更多的细节和必要的代码。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~
一旦访问AVPlayer
的audiopath并进行录制, 测量就相对简单明了。
audio级别
在我对有关测量麦克风input的堆栈问题的回答中 ,我描述了访问audio电平测量所需的步骤。 使用AVAudioRecorder
来监视音量的变化AVAudioRecorder
要复杂的多,所以我包含了一个GitHub 项目 ,这个项目可以在录制的时候监听audio的变化。
~~~~~~~~~~~~~~~~~~~~~~~~~~ 请注意 ~~~~~~~~~~~~~~~~~~~~~~ ~~~~
HLS直播期间的这种组合不是我testing过的。 这个答案是严格的理论上的,所以可能需要对这两个类完全理解。