2011-01-25 24 views
5

Tôi hiện đang cố gắng phát nhạc từ thư viện iPod trên điện thoại bằng cách sử dụng AVPlayer thay vì MPMusicPlayerController bằng bộ điều khiển ứng dụng.setVolume không hoạt động trên AVMutableAudioMixInputParameters với việc phát từ điện thoại thư viện iPod cục bộ

Tôi có thể làm cho nó chọn một bản nhạc từ thư viện địa phương bằng cách sử dụng và MPMediaQuery, nhưng khi tôi cố gắng để bắt đầu âm thanh ở mức thấp hơn bằng AVMutableAudioMixInputParameters, nó dường như không làm giảm âm lượng.

Lý do tôi đang sử dụng AVPlayer chứ không phải MPMusicPlayerController là tôi đang phát một số âm thanh khác trong nền cùng lúc và MPMusicPlayerController không phát dưới dạng tệp âm thanh hiện có bằng AVPlayer đang hogging phần cứng. Mã tôi có vào lúc này là:

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

Vì vậy, tại mảng điểm này là một mảng các bản nhạc từ lib của tôi.

Bây giờ để lấy một và chơi nó sử dụng 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]; 

tôi có thể xác nhận rằng điều chỉnh âm lượng công trình khi sử dụng AVPlayer để chơi các tập tin từ một URL (trực tuyến); không chỉ khi chơi từ thư viện địa phương.

Tôi nhận thấy mình chưa thực hiện bất kỳ quản lý bộ nhớ nào tại đây; chỉ cố gắng làm cho nó hoạt động trước. Ngoài ra, người chơi địa phương là tài sản nên không còn giữ lại rõ ràng.

Bất kỳ trợ giúp nào sẽ được đánh giá rất nhiều!

Cảm ơn.

+0

Tôi không phải là một nhà phát triển iPhone, nhưng isn Tên của chức năng đó ... hơi quá lâu? – aviraldg

+0

heh, đó là một chút - nhưng nó là một hàm/hàm stdlib. –

+0

Bạn đã quản lý để tìm giải pháp ..? –

Trả lời

0

Bạn đã thử thay thế kCMTimeZero bằng CMTimeMakeWithSeconds (0,1) hay đơn giản là 0?

Nếu vẫn thất bại, hãy thử các phai có hiệu lực ra/vào và thiết lập thời gian bắt đầu và thời gian kết thúc 0.

+0

không hoạt động :( –

1

AVMutableAudioMix chỉ có sẵn cho File Dựa Media, không Sống http streaming.

0

Thử sử dụng giá trị thời gian âm như CMTimeMake(-1, 1) thay vì kCMTimeZero.

1

Công việc này cho tôi (fade in):

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

khi người dùng bỏ qua bài hát kế tiếp hoặc theo dõi gần như xong tôi gọi chức năng:

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