2011-01-25 11 views
5

を遊んでAVMutableAudioMixInputParametersに取り組んでいません。setVolumeは、私は現在、アプリケーションのコントローラを使用してというよりも、MPMusicPlayerController AVPlayer使用して携帯電話のローカルiPodのライブラリから音楽を再生しようとしている携帯電話からローカルのiPodライブラリー

ローカルのiPodライブラリから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]; 
} 

です。この時点で、配列はmy libのトラックの配列です。

今1を取得し、使用してそれを再生する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の開発者ではないんだけど、ISNその関数の名前...少し長すぎる? – aviraldg

+0

heh、それはビットですが、stdlibのlib /関数です。 –

+0

解決策を見つけることができましたか? –

答えて

0

あなたはCMTimeMakeWithSeconds(0,1)とkCMTimeZeroを交換しようとした、または単に0がありますか? HTTPライブストリーミングではない

それがまだ失敗する場合は、/アウト効果でフェードインを試してみて、0

+0

どちらも動作しません:( –

1

AVMutableAudioMixに開始時刻と終了時刻を設定するには、メディアベースのファイルでのみ使用可能です。

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]; 
} 
関連する問題