setVolume не работает на AVMutableAudioMixInputParameters при воспроизведении с телефона из локальной библиотеки iPod

В настоящее время я пытаюсь воспроизвести музыку из локальной библиотеки iPod телефона с помощью AVPlayer, а не MPMusicPlayerController, используя контроллер приложения.

Я могу заставить его выбрать дорожку из локальной библиотеки 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];
}

Итак, на данный момент массив - это массив треков из моей библиотеки.

Теперь, чтобы взять один и воспроизвести его с помощью 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-адреса (потоковая передача); только не при игре из местной библиотеки.

Я понимаю, что здесь я не занимался управлением памятью; просто пытаюсь сначала заставить его работать. Кроме того, локальный игрок является собственностью, поэтому здесь нет явного удержания.

Любая помощь будет принята с благодарностью!

Спасибо.


person Ben Novakovic    schedule 25.01.2011    source источник
comment
Я не разработчик iPhone, но разве название этой функции ... не слишком длинное?   -  person aviraldg    schedule 25.01.2011
comment
хех, это немного, но это stdlib lib / function.   -  person Ben Novakovic    schedule 25.01.2011
comment
Удалось найти решение ..?   -  person Aatish Molasi    schedule 03.05.2012


Ответы (4)


AVMutableAudioMix доступен только для файловых носителей, но не для потоковой передачи HTTP в реальном времени.

person Iain McLean    schedule 04.09.2012

Эта работа для меня (исчезает):

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];
}
person Maxim    schedule 21.08.2013

Вы пробовали заменить kCMTimeZero на CMTimeMakeWithSeconds (0,1) или просто на 0?

Если это все еще не удается, попробуйте эффект постепенного появления / исчезновения и установите время начала и время окончания на 0.

person Dallas Clark    schedule 27.01.2011

Попробуйте использовать отрицательное значение времени, например CMTimeMake(-1, 1) вместо kCMTimeZero.

person TP.    schedule 06.07.2013