当前歌曲在后台播放的样本分贝等级

时间:2011-08-28 05:57:15

标签: iphone avaudioplayer

我正试图在我的应用程序中获得IOS iPod正在播放的歌曲的分贝级别。我知道我可以用[[[MPMusicPlayerController iPodMusicPlayer] nowPlayingItem]获取有关该歌曲的信息,我知道我可以使用AVAudioPlayer peakPowerForChannel方法告诉歌曲的分贝级别,但我没有运气将两者串在一起来取样当前播放歌曲的分贝等级。

3 个答案:

答案 0 :(得分:1)

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

使用AVAudioPlayer

averagePowerForChannel完成

还有一个代码示例:AvTouch

如果您想通过从媒体播放器中选择曲目来集成此功能,请按以下链接建议此过程:

iphone - Using MPMediaItems with AVAudioPlayer - Stack Overflow

Use MPMediaPicker selections as AVAudioPlayer inputs

答案 1 :(得分:1)

我一直在寻找相同的东西而且我能够做到这一点,但这不是一个简单的过程。

首先,我使用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]];
}

关于这一点的坏处是,因为你正在复制文件,你的应用程序需要更多的空间,其次,我认为用户可能有一个文件因为不同的文件类型而不能导出,兼容性,等等等等等等...

我希望这会有所帮助。我花了几天的时间试图在网上阅读了大量的解决方案,但这似乎是唯一能让它成为现实的解决方案。

答案 2 :(得分:0)

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

代码很简单,我想你正在尝试类似的事情。这对我有用:

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