当前歌曲在后台播放的样本分贝水平

问题描述:

我试图在我的应用中获取iOS的iPod播放歌曲的分贝水平。我知道我可以用[[[MPMusicPlayerController iPodMusicPlayer] nowPlayingItem]获得关于该歌曲的信息,并且我知道我可以使用AVAudioPlayer peakPowerForChannel方法来分辨歌曲的分贝级别,但是我没有运气串起这两者来对歌曲进行采样当前播放歌曲的分贝级别。当前歌曲在后台播放的样本分贝水平

我正在寻找同样的东西,我能够做到这一点,但它不是一个简单的过程。

首先,我使用TSLibraryExport将iPod中的歌曲导出到我的app目录中。原因是经过多次尝试,1)AVPlayer和MPMusicPlayerController根本不会给你分贝级别。 2)无论如何,AVAudioPlayer不会从MediaPicker读取MPMediaItemPropertyAssetURL。似乎来自iPod的NSURL不是真正的文件路径,因此它不会读取它。至少我不能这样做。

所以,

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的出口到你的应用程序,在setUpAVPlayerForURL或任何你的方法名是初始化AVAudioPlayer。

-(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]]; 
} 

关于这个坏事是因为要复制的文件,你的应用程序将需要更多的空间,和第二,我认为用户可能因为不同的文件类型,不会导出文件,兼容性,等等等等等等......

我希望这有助于。我花了几天的时间尝试在网上阅读很多东西后想出一个解决方案,但这似乎是唯一一个使它成为可能的解决方案。

答案可以在这个问题上找到:How can I implement a volume meter for a song currently playing? (iPhone OS 3.1.3)

它使用的AVAudioPlayer

averagePowerForChannel还有一个代码示例完成:​​

如果你想这个通过选择曲目整合从媒体播放器,以下链接建议在此过程中:

iphone - Using MPMediaItems with AVAudioPlayer - Stack Overflow

Use MPMediaPicker selections as AVAudioPlayer inputs

+0

虽然这使我得到了我想要的90%,但我仍然坚持我的位置,因为AVAudioPlayer类需要通过指向要播放的文件或内存来创建缓冲...我没有那个..我想获得用户已经通过iPod播放歌曲的信息。 – FierceMonkey

+0

看到我上面的编辑! – snibbe

+0

我查看了你的链接,但我仍然没有看到从用户在后台播放的歌曲中获得音量的方法。 – FierceMonkey

我能够以更简单的方式做到你想要的混合。

代码很简单,我猜你是在尝试类似的事情。这对我有效:

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];