2011-01-25 44 views
5

我目前正在嘗試使用AVPlayer而不是MPMusicPlayerController使用應用程序控制器從手機本地iPod庫播放音樂。setVolume不能用於AVMutableAudioMixInputParameters從手機播放本地iPod庫

我可以從本地iPod lib使用MPMediaQuery選擇音軌,但是當我嘗試使用AVMutableAudioMixInputParameters在較低級別啓動音頻時,它似乎並沒有降低音量。

我使用AVPlayer而不是MPMusicPlayerController的原因是我在同一時間在後臺播放一些其他音頻,並且MPMusicPlayerController無法使用AVPlayer播放現有音頻文件來佔用硬件。我現在的代碼是:

// just blindly select all music for now. 
MPMediaQuery *everything = [[MPMediaQuery alloc] init]; 

NSArray *itemsFromGenericQuery = [everything items]; 
MPMediaItem *song; 
NSMutableArray *array = [[NSMutableArray alloc] init]; 

for (song in itemsFromGenericQuery) 
{ 
    [array addObject:song]; 
} 

所以在這一點上,數組是來自我的lib的軌道數組。

我們搶單,並使用播放AVPlayer:

// grab the first song off the array 
MPMediaItem *song = [array objectAtIndex:0]; 
NSURL *assetURL = [song valueForProperty:MPMediaItemPropertyAssetURL]; 
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:assetURL options:nil]; 

NSArray *audioTracks = [asset tracksWithMediaType:AVMediaTypeAudio]; 
AVAssetTrack *track = [audioTracks objectAtIndex:0]; 

NSMutableArray *allAudioParams = [NSMutableArray array]; 
AVMutableAudioMixInputParameters *audioInputParams = 
     [AVMutableAudioMixInputParameters audioMixInputParameters]; 

// this is the key line - turn the volume down. 
[audioInputParams setVolume:0.3 atTime:kCMTimeZero]; 
[audioInputParams setTrackID:[track trackID]]; 
[allAudioParams addObject:audioInputParams]; 

AVMutableAudioMix *audioZeroMix = [AVMutableAudioMix audioMix]; 
[audioZeroMix setInputParameters:allAudioParams]; 

// Create a player item 
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset]; 

[playerItem setAudioMix:audioZeroMix]; 
[playerItem seekToTime:CMTimeMake(30, 1)]; 

[self setLocalPlayer:[AVPlayer playerWithPlayerItem:playerItem]]; 
[localPlayer play]; 

我可以證實,在調節音量作品使用AVPlayer時從一個URL(流)播放文件;而不是在當地圖書館玩。

我意識到我在這裏沒有做過任何內存管理;只是想讓它首先工作。此外,本地球員是一個財產,所以沒有明確的保留。

任何幫助將不勝感激!

謝謝。

+0

我不是iPhone開發者,但是,這不是那個功能的名字...有點太長了? – aviraldg 2011-01-25 01:15:43

+0

嘿,它有點 - 但它是一個stdlib庫/函數。 – 2011-01-25 01:29:20

回答

0

您是否嘗試用CMTimeMakeWithSeconds(0,1)替換kCMTimeZero,或者只是0?

如果還是失敗,請嘗試輸入/輸出淡入效果和開始時間和結束時間設置爲0

1

AVMutableAudioMix只是基於媒體,不住HTTP流適用於文件。

0

嘗試使用負值時間值,例如CMTimeMake(-1, 1)而不是kCMTimeZero

1

這項工作對我來說(淡入):

NSString *songName = [NSString stringWithFormat:@"http://xx.xx.xx.xx/%d%@", bitrate, url]; 
playerItem = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:songName]]; 

NSArray *audioTracks = [[playerItem asset] tracks]; 

AVMutableAudioMixInputParameters *audioInputParams = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:audioTracks[0]]; 
[audioInputParams setVolumeRampFromStartVolume:0.0 toEndVolume:1.0 timeRange:CMTimeRangeMake(CMTimeMakeWithSeconds(0.0, 1.0), CMTimeMakeWithSeconds(3.0, 1.0))]; 

AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix]; 
[audioMix setInputParameters:@[audioInputParams]]; 

[playerItem setAudioMix:audioMix]; 

AVPlayer *player = [[AVPlayer alloc] initWithPlayerItem:playerItem]; 

當用戶跳至下一首曲目或曲目幾乎完成我打電話功能:

- (void)fadeOut { 
    seconds = CMTimeGetSeconds(playerItem.currentTime); 

    NSArray *audioTracks = [[playerItem asset] tracks]; 

    AVMutableAudioMixInputParameters *audioInputParams = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:audioTracks[0]]; 
    [audioInputParams setVolumeRampFromStartVolume:1.0 toEndVolume:0.0 timeRange:CMTimeRangeMake(CMTimeMakeWithSeconds(seconds, 1.0), CMTimeMakeWithSeconds(3.0, 1.0))]; 

    AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix]; 
    [audioMix setInputParameters:@[audioInputParams]]; 

    [playerItem setAudioMix:audioMix]; 
}