Я использую AVPlayer
для радиоприложения, использующего потоковое вещание HTTP. Теперь я хочу реализовать измеритель уровня для этого аудиопотока. Самое лучшее - это измеритель уровня, показывающий разные частоты, но простое решение влево/вправо станет отличной отправной точкой.
Я нашел несколько примеров, используя AVAudioPlayer
. Но я не могу найти решение для получения необходимой информации AVPlayer
.
Кто-нибудь может подумать о решении моей проблемы?
EDIT Я хочу создать что-то вроде этого (но приятнее)
EDIT II
Было предложено использовать MTAudioProcessingTap
для получения исходных аудиоданных. Примеры, которые я мог найти, используя массив [[[_player currentItem] asset] tracks]
, который, в моем случае, пустой массив. Другое предложение состояло в том, чтобы использовать [[_player currentItem] audioMix]
, который для меня null
.
EDIT 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];
}
Пока все хорошо. Все это работает, я могу найти нужный трек и настроить параметры вводаParams и audioMix и т.д. Но, к сожалению, единственным обратным вызовом, который вызывается, является обратный вызов init. Ни один из других не будет стрелять в любой момент.
Я попробовал разные (виды) потоковых источников, один из которых - официальный поток Apple HLS: http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8