Измеритель уровня живого потока AVPlayer HLS (отображение данных FFT)
м используюAVPlayer
для радиоприложения, использующего потоковую передачу по HTTP. Теперь я хочу реализовать измеритель уровня для этого аудиопотока. Лучше всего будет измеритель уровня, показывающий разные частоты, но простым левым / правым решением будет отличная отправная точка.
Я нашел несколько примеров, используяAVAudioPlayer
, Но я не могу найти решение для получения необходимой информации.AVPlayer
Может кто-нибудь придумать решение моей проблемы?
РЕДАКТИРОВАТЬ Я хочу создать что-то вроде этого (но лучше)
РЕДАКТИРОВАТЬ II
Одним из предложений было использоватьMTAudioProcessingTap
чтобы получить необработанные аудио данные. Примеры, которые я мог найти, используя[[[_player currentItem] asset] tracks]
массив, который в моем случае является пустым массивом. Другое предложение было использовать[[_player currentItem] audioMix]
которыйnull
для меня.
РЕДАКТИРОВАТЬ III
Послелет уже, кажется, до сих пор нет решения. Я действительно добился прогресса, поэтому яЯ делюсь этим.
Во время настройки яm добавление наблюдателя значения ключа в 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