2011-08-28 10 views
1

IOS의 iPod에서 재생중인 노래의 앱에서 데시벨 수준을 얻으려고합니다. 나는 내가 [[[MPMusicPlayerController iPodMusicPlayer] nowPlayingItem]으로 노래에 관한 정보를 얻을 수 있다는 것을 알고 있으며, AVAudioPlayer peakPowerForChannel 메소드를 사용하여 데시벨 레벨을 말할 수는 있지만, 그 둘을 함께 샘플링하여 운율을 측정하지는 못했다. 현재 연주중인 곡의 데시벨 레벨.백그라운드에서 현재 노래 재생을위한 샘플 데시벨 수준

답변

1

나는 똑같은 것을 찾고 있었지만 할 수 있었다. 그러나 그것은 곧장 나아갈 과정이 아니었다.

먼저 TSLibraryExport을 사용하여 iPod에서 내 앱 디렉토리로 노래를 내 보냅니다. 그 이유는 많은 시도 후에, 1) AVPlayer와 MPMusicPlayerController는 단순히 데시벨 레벨을 제공하지 않기 때문입니다. 2) AVAudioPlayer는 MediaPicker에서 MPMediaItemPropertyAssetURL을 읽지 않습니다. iPod에서 NSURL이 실제 파일 경로가 아닌 것 같아서 읽을 수 없습니다. 적어도 나는 이렇게 할 수 없었다.

그래서,

1)은 TSLibraryExport을 Downlaod 당신은 앱에 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]]; 
} 

이것에 대해 나쁜 것은 당신이 파일을 복사하고 있기 때문에, 앱이 더 많은 공간을 필요로한다고하고, 둘째, 나는 사용자가 있기 때문에 다른 파일 형식으로 내보낼 수 없습니다 파일이있을 수 있습니다 생각, 호환성, blah blah blah ...

나는 이것이 도움이되기를 바랍니다. 나는 온라인으로 많은 것을 읽은 후에 해결책을 생각해 내려고 며칠을 보냈지 만, 이것이 가능한 유일한 것으로 보였다.

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

+0

이것은 내가 원하는 것의 90 %를 얻었지만, AVAudioPlayer 클래스는 재생할 파일이나 메모리를 가리켜 만들어야한다는 점에서 여전히 내가 갇혀 있습니다. 버퍼 ... 나는 그걸 가지고 있지 않습니다 .. 나는 사용자가 이미 아이팟을 통해 연주하고있는 노래에 대한 정보를 얻고 싶습니다. – 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]; 
관련 문제