Подтвердить что ты не робот

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

4b9b3361

Ответ 1

К сожалению, использование потока HLS с AVFoundation не дает вам никакого контроля над звуковыми дорожками. Я столкнулся с той же проблемой, пытаясь отключить поток HLS, который оказался невозможным.

Единственный способ, которым вы могли бы читать аудиоданные, - это нажать AVAudioSession.

ИЗМЕНИТЬ

Вы можете получить доступ к AVAudioSession следующим образом:

[AVAudioSession sharedInstance]

Здесь документация для AVAudioSession

Ответ 2

Измерение звука с использованием AVPlayer выглядит проблемой, которая все еще продолжается. При этом я считаю, что решение может быть достигнуто путем объединения AVPlayer с AVAudioRecorder.

В то время как у двух классов есть, казалось бы, противоречивые цели, есть работа, которая позволяет AVAudioRecorder получить доступ к аудиовыходу AVPlayer.

Player/Recorder

Как описано в этом ответе, запись аудио AVPlayer возможна, если вы получаете доступ к изменению маршрута аудио с помощью kAudioSessionProperty_AudioRouteChange.

Обратите внимание, что запись звука должна быть начата после, чтобы получить доступ к изменению маршрута аудио. Используйте ответ связанного стека как ссылку - он содержит более подробную информацию и необходимый код.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~

Как только вы получите доступ к аудиодорожке AVPlayer и записываете, измерение относительно просто.

Уровни аудио

В ответе на вопрос о стеке, касающемся измерения входа микрофона, я описываю шаги, необходимые для доступа к измерениям уровня звука. Использование AVAudioRecorder для контроля изменений объема является более сложным, чем можно было бы подумать, поэтому я включил проект GitHub , который действует как шаблон для мониторинга звука изменяется во время записи.

~~~~~~~~~~~~~~~~~~~~~~~~~~ Обратите внимание ~~~~~~~~~~~~ ~~~~~~~~~~~~~~

Эта комбинация во время потокового потока HLS не является тем, что я тестировал. Этот ответ носит строго теоретический характер, поэтому вполне может быть понятно, что оба класса будут работать полностью.