Примерный уровень децибела для текущей песни, играющей в фоновом режиме - PullRequest
1 голос
/ 28 августа 2011

Я пытаюсь получить уровень децибела в своем приложении для песни, которую играет IOS на iPod.Я знаю, что могу получить информацию о песне с помощью [[[[MPMusicPlayerController iPodMusicPlayer] nowPlayingItem], и я знаю, что могу определить уровень децибела в песне, используя метод peakPowerForChannel AVAudioPlayer, но мне не повезло связать их вместе, чтобы сэмплироватьУровень децибела для текущей воспроизводимой песни.

Ответы [ 3 ]

1 голос
/ 01 ноября 2011

Я искал то же самое, и я смог это сделать, но это был не простой процесс.

Сначала я использовал TSLibraryExport , чтобы экспортировать песню с iPod в каталог моего приложения. Причина в том, что после многих попыток 1) AVPlayer и MPMusicPlayerController просто не дадут вам уровни децибел. 2) AVAudioPlayer не будет читать MPMediaItemPropertyAssetURL из MediaPicker, несмотря ни на что. Похоже, что NSURL от iPod не является реальным путем к файлу, поэтому он просто не будет читать его. По крайней мере, я не мог сделать это таким образом.

Итак,

1) Загрузите TSLibraryExport, и вы увидите способы экспорта из iPod в ваше приложение. Я просто использовал их из этой библиотеки:

-(IBAction) handleExportTapped {}
-(void) updateExportProgress: (NSTimer*) timer {} //this is actually nice to display the progress
-(void) setUpAVPlayerForURL: (NSURL*) url {} //this is triggered after the export is done
static BOOL coreAudioCanOpenURL (NSURL* url) {} 
static NSString* myDocumentsDirectory() {}

2) Как только вы сможете экспортировать данные с iPod в свое приложение, инициализируйте AVAudioPlayer в setUpAVPlayerForURL или как там у вас имя метода.

-(void) setUpAVPlayerForURL: (NSURL*) url {
newPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL: url error: nil];
[newPlayer setMeteringEnabled:YES];
[NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(getLevel:) userInfo:nil repeats: YES]; 
[newPlayer play];}

newPlayer - это переменная экземпляра AVAudioPlayer, объявленная в вашем заголовочном файле.

3) Теперь, когда вы импортировали песню в свое приложение и она воспроизводится, вы можете показать децибелы, как хотите. В моем тесте я просто выбросил их в ярлык.

- (void)getLevel:(NSTimer *)timer {
if (newPlayer.playing == YES) {
    [newPlayer updateMeters];
    dBLevel = [newPlayer averagePowerForChannel:1]; //dBlevel is a float ivar declared in my header file
    dBLabel.text = [NSString stringWithFormat:@"%.01f",dBLevel]; //%.01f is just to show 2 decimals
    nowPlayingLabel.text = [NSString stringWithFormat:@"%.01f",[newPlayer peakPowerForChannel:1]];
}

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

Надеюсь, это поможет. Я потратил несколько дней, пытаясь придумать решение после того, как много читал в Интернете, но это казалось единственным, что позволило это сделать.

1 голос
/ 13 октября 2011

Ответ можно найти в этом вопросе: Как я могу реализовать измеритель громкости для песни, которая воспроизводится в данный момент? (iPhone OS 3.1.3)

Это делается с использованием averagePowerForChannel из AVAudioPlayer

Существует также пример кода: AvTouch

Если вы хотите интегрировать это, выбирая треки из медиапроигрывателя, следующие ссылки рекомендуют этот процесс:

iphone - Использование MPMediaItems с AVAudioPlayer - Переполнение стека

Использование выбора MPMediaPicker в качестве входов AVAudioPlayer

0 голосов
/ 20 марта 2014

Я смог сделать то, что вы хотите, смешивая оба способа гораздо проще.

Код прост, и я думаю, вы пытались сделать что-то подобноеЭто сработало для меня:

    MPMediaItem *item = musicPlayer.nowPlayingItem;
    NSURL *url = [item valueForProperty:MPMediaItemPropertyAssetURL];
    [self playSong:url];
    _audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
    [_audioPlayer setNumberOfLoops:-1];
    [_audioPlayer setMeteringEnabled:YES];
...