我正试图在我的应用程序中获得IOS iPod正在播放的歌曲的分贝级别。我知道我可以用[[[MPMusicPlayerController iPodMusicPlayer] nowPlayingItem]获取有关该歌曲的信息,我知道我可以使用AVAudioPlayer peakPowerForChannel方法告诉歌曲的分贝级别,但我没有运气将两者串在一起来取样当前播放歌曲的分贝等级。
答案 0 :(得分:1)
答案可以在这个问题中找到:How can I implement a volume meter for a song currently playing? (iPhone OS 3.1.3)
的averagePowerForChannel
完成
还有一个代码示例:AvTouch
如果您想通过从媒体播放器中选择曲目来集成此功能,请按以下链接建议此过程:
iphone - Using MPMediaItems with AVAudioPlayer - Stack Overflow
答案 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];