Я искал то же самое, и я смог это сделать, но это был не простой процесс.
Сначала я использовал 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]];
}
Плохая вещь в этом заключается в том, что, поскольку вы копируете файл, вашему приложению потребуется больше места, и, во-вторых, я думаю, что у пользователя может быть файл, который не будет экспортироваться из-за различных типов файлов, совместимости, бла-бла бла ...
Надеюсь, это поможет. Я потратил несколько дней, пытаясь придумать решение после того, как много читал в Интернете, но это казалось единственным, что позволило это сделать.