現在、アプリケーション コントローラーを使用して MPMusicPlayerController ではなく、AVPlayer を使用して電話のローカル iPod ライブラリから音楽を再生しようとしています。
MPMediaQuery を使用してローカルの iPod lib からトラックを選択できますが、AVMutableAudioMixInputParameters を使用して低いレベルでオーディオを開始しようとすると、音量がまったく下がらないようです。
MPMusicPlayerController ではなく AVPlayer を使用している理由は、同時にバックグラウンドで他のオーディオを再生していて、AVPlayer を使用している既存のオーディオ ファイルがハードウェアを占有しているため、MPMusicPlayerController が再生に失敗するためです。現時点で持っているコードは次のとおりです。
// 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];
}
したがって、この時点で、配列は私のライブラリからのトラックの配列です。
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 からファイルを再生する (ストリーミング) 場合、音量の調整が機能することを確認できます。ローカルライブラリから再生するときだけではありません。
ここでメモリ管理を行っていないことに気付きました。最初にそれを機能させようとしているだけです。また、ローカル プレーヤーはプロパティであるため、明示的な保持はありません。
どんな助けでも大歓迎です!
ありがとう。