我正在使用AVPlayer
来使用HTTP直播的广播应用。现在我想为该音频流实现一个电平表。最好的水平仪显示不同的频率,但简单的左/右解决方案将是一个很好的起点。
我使用AVAudioPlayer
找到了几个例子。但我无法找到一个解决方案来获取AVPlayer
所需的信息。
有人能想出解决我问题的方法吗?
编辑我想创建这样的东西(但更好)
编辑II
一个建议是使用MTAudioProcessingTap
来获取原始音频数据。我可以使用[[[_player currentItem] asset] tracks]
数组找到的示例,在我的例子中,这是一个空数组。另一个建议是使用[[_player currentItem] audioMix]
null
给我。
编辑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
答案 0 :(得分:1)
遗憾的是,使用带AVFoundation
的HLS流并不能让您对音轨进行任何控制。我遇到了同样的问题,试图将HLS流静音,结果证明这是不可能的。
您可以阅读音频数据的唯一方法是使用AVAudioSession
。
修改的
您可以像这样访问AVAudioSession:
[AVAudioSession sharedInstance]
的文档
答案 1 :(得分:1)
使用AVPlayer
测量音频看起来仍然是一个问题。话虽如此,我相信可以通过将AVPlayer
与AVAudioRecorder
相结合来达成解决方案。
虽然这两个类看似矛盾,但有一种方法可以让AVAudioRecorder
访问AVPlayer
的音频输出。
如本Stack Overflow Answer所述,如果您使用kAudioSessionProperty_AudioRouteChange
访问音频路线更改,则可以录制AVPlayer的音频。
请注意,必须在>>访问音频路径更改后启动录音。使用链接堆栈答案作为参考 - 它包含更多详细信息和必要的代码。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
一旦您有权访问AVPlayer
的音频路径并进行录制,测量就相对简单了。
在answer关于测量麦克风输入的堆栈问题中,我描述了访问音频电平测量所需的步骤。使用AVAudioRecorder
来监控音量变化比人们想象的要复杂得多,所以我加入了一个GitHub project,作为录制时监听音频变化的模板。
~~~~~~~~~~~~~~~~~~~~~~~~~~ 请注意 ~~~~~~~~~~~~ ~~~~~~~~~~~~~~
HLS直播期间的这种组合不是我测试过的。这个答案完全是理论上的,因此可能需要对这两个类完全理解。