AVPlayer HLS-индикатор уровня потока в реальном времени (отображение данных FFT)
Я использую AVPlayer
для радиоприложения, использующего потоковое вещание HTTP. Теперь я хочу реализовать измеритель уровня для этого аудиопотока. Самое лучшее - это измеритель уровня, показывающий разные частоты, но простое решение влево/вправо станет отличной отправной точкой.
Я нашел несколько примеров, используя AVAudioPlayer
. Но я не могу найти решение для получения необходимой информации AVPlayer
.
Кто-нибудь может подумать о решении моей проблемы?
EDIT Я хочу создать что-то вроде этого (но приятнее)
![nice levelmeter]()
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
Ответы
Ответ 1
К сожалению, использование потока HLS с AVFoundation
не дает вам никакого контроля над звуковыми дорожками. Я столкнулся с той же проблемой, пытаясь отключить поток HLS, который оказался невозможным.
Единственный способ, которым вы могли бы читать аудиоданные, - это нажать AVAudioSession
.
ИЗМЕНИТЬ
Вы можете получить доступ к AVAudioSession следующим образом:
[AVAudioSession sharedInstance]
Здесь документация для AVAudioSession
Ответ 2
Измерение звука с использованием AVPlayer
выглядит проблемой, которая все еще продолжается. При этом я считаю, что решение может быть достигнуто путем объединения AVPlayer
с AVAudioRecorder
.
В то время как у двух классов есть, казалось бы, противоречивые цели, есть работа, которая позволяет AVAudioRecorder
получить доступ к аудиовыходу AVPlayer
.
Player/Recorder
Как описано в этом ответе, запись аудио AVPlayer возможна, если вы получаете доступ к изменению маршрута аудио с помощью kAudioSessionProperty_AudioRouteChange
.
Обратите внимание, что запись звука должна быть начата после, чтобы получить доступ к изменению маршрута аудио. Используйте ответ связанного стека как ссылку - он содержит более подробную информацию и необходимый код.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
Как только вы получите доступ к аудиодорожке AVPlayer
и записываете, измерение относительно просто.
Уровни аудио
В ответе на вопрос о стеке, касающемся измерения входа микрофона, я описываю шаги, необходимые для доступа к измерениям уровня звука. Использование AVAudioRecorder
для контроля изменений объема является более сложным, чем можно было бы подумать, поэтому я включил проект GitHub , который действует как шаблон для мониторинга звука изменяется во время записи.
~~~~~~~~~~~~~~~~~~~~~~~~~~ Обратите внимание ~~~~~~~~~~~~ ~~~~~~~~~~~~~~
Эта комбинация во время потокового потока HLS не является тем, что я тестировал. Этот ответ носит строго теоретический характер, поэтому вполне может быть понятно, что оба класса будут работать полностью.