5

現在、アプリケーション コントローラーを使用して 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 からファイルを再生する (ストリーミング) 場合、音量の調整が機能することを確認できます。ローカルライブラリから再生するときだけではありません。

ここでメモリ管理を行っていないことに気付きました。最初にそれを機能させようとしているだけです。また、ローカル プレーヤーはプロパティであるため、明示的な保持はありません。

どんな助けでも大歓迎です!

ありがとう。

4

4 に答える 4

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];
}
于 2013-08-21T10:11:42.777 に答える
1

AVMutableAudioMixライブ HTTP ストリーミングではなく、ファイル ベースのメディアでのみ使用できます。

于 2012-09-04T16:17:02.697 に答える
0

CMTimeMake(-1, 1)の代わりになどの負の時間値を使用してみてくださいkCMTimeZero

于 2013-07-06T19:27:36.623 に答える
0

kCMTimeZero を CMTimeMakeWithSeconds(0,1) または単に 0 に置き換えてみましたか?

それでもうまくいかない場合は、フェードイン/アウト効果を試して、開始時間と終了時間を 0 に設定してください。

于 2011-01-27T00:32:48.947 に答える