2011-08-28 35 views
1

我試圖在我的應用中獲取iOS的iPod播放歌曲的分貝水平。我知道我可以用[[[MPMusicPlayerController iPodMusicPlayer] nowPlayingItem]獲得關於該歌曲的信息,並且我知道我可以使用AVAudioPlayer peakPowerForChannel方法來分辨歌曲的分貝級別,但是我沒有運氣串起這兩者來對歌曲進行採樣當前播放歌曲的分貝級別。當前歌曲在後臺播放的樣本分貝水平

回答

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

關於這個壞事是因爲要複製的文件,你的應用程序將需要更多的空間,和第二,我認爲用戶可能因爲不同的文件類型,不會導出文件,兼容性,等等等等等等......

我希望這有助於。我花了幾天的時間嘗試在網上閱讀很多東西后想出一個解決方案,但這似乎是唯一一個使它成爲可能的解決方案。

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

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]; 
相關問題