2013-04-23 5 views
0

Я хотел изменить настройки громкости с помощью UISlider.Объем AVQueuePlayer не изменен

Я использовал currentItem внутри AVQueuePlayer. ps0 является AVQueuePlayer.

У меня нет ошибок и одинакового уровня звука, когда я использую мой UISlider:

- (IBAction)volumeSliderMoved:(UISlider *)sender 
{ 
    AVMutableAudioMixInputParameters *audioInputParams = [AVMutableAudioMixInputParameters audioMixInputParameters]; 

    AVPlayerItem *av = [ps0 currentItem]; 
    CMTime currentTime = [av currentTime]; 
    float volume = [sender value]; 

    [audioInputParams setVolume:volume atTime:currentTime]; 
    AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix]; 
    audioMix.inputParameters = [NSArray arrayWithObject:audioInputParams]; 
    av.audioMix = audioMix; 

    [ps0 replaceCurrentItemWithPlayerItem: av]; 
} 

Редакция: Я попробовал другой solution от Apple, чтобы изменить настройки громкости.

Как вы можете видеть в этом решении, он создает новый playerItem и новый плеер.

Но мой playerItem является копией текущего, потому что я просто хочу изменить звук (а не элемент). И это автоматически связано со старым игроком.

Когда я пытаюсь использовать их решение. У меня есть сообщение об ошибке, говорящее:

AVPlayerItem не может быть связан с более чем одним экземпляром AVPlayer

Любое предложение?

EDITED снова

Чтобы изменить воспроизведение с AVQueuePlayer

У меня есть массив с каждым mp3 названием «textMissingTab»

У меня есть массив с AVPlayerItem «soundItems»

Создание:

textMissingTab = [[NSArray alloc] initWithObjects:@"cat",@"mouse",@"dog",@"shark",@"dolphin", @"eagle", @"fish", @"wolf", @"rabbit", @"person", @"bird", nil]; 

for (NSString *text in textMissingTab) 
{ 
    NSURL *soundFileURL = [[NSURL alloc] initFileURLWithPath: [[NSBundle mainBundle] pathForResource:text ofType:@"mp3"]]; 
    AVPlayerItem *item = [AVPlayerItem playerItemWithURL:soundFileURL]; 
    [soundItems addObject:item]; 
} 

Init:

NSURL *soundFileURL = [[NSURL alloc] initFileURLWithPath: [[NSBundle mainBundle] pathForResource:@"dog" ofType:@"mp3"]]; 
ps0 = [[AVQueuePlayer alloc] initWithURL:soundFileURL]; 

Изменение воспроизводимого элемента,: текст NSString

int index = [textMissingTab indexOfObject:text]; 
[ps0 setActionAtItemEnd:AVPlayerActionAtItemEndNone]; 
CMTime newTime = CMTimeMake(0, 1); 
[ps0 seekToTime:newTime]; 
[ps0 setRate:1.0f]; 
[ps0 replaceCurrentItemWithPlayerItem:[soundItems objectAtIndex:(index)]]; 
[ps0 play]; 

ответ

0

У меня было несколько проблем с использованием AVQueuePlayer и изменение параметров воспроизведения. Если ваша цель - использовать слайдер для регулировки громкости, я бы заменил UISlider пустым UIView в вашем раскадровке, а затем создавал MPVolumeView в этом представлении. Это работает надежно для меня. Обратите внимание, что MPVolumeView не отображается на симуляторе.

+0

Спасибо, это большая идея использовать MPVolumeView для управления уровнем звука – 2013-04-24 07:39:17

0

Я думаю, что вы правы в тигле. MPVolumeView - лучший способ управления уровнем звука.

Это объясняется в этом учебнике:. http://www.littlereddoor.co.uk/ios/controlling-system-output-volume-by-adding-an-mpvolumeview-object-to-an-ios-application/

«Все работает точно так, как и следовало ожидать, пока пользователь не попадает в камень преткновения, который создается текущей громкости звонка, который установлен на устройстве Максимальное значение свойство AVAudioPlayer равно 1.0, где 1.0 равно текущей настройке громкости звонка устройства. Проще говоря, если громкость звонка устройства установлена ​​на 50% громкости, то 100% объема AVAudioPlayer по-прежнему только соответствует уже установленному 50% звонку. Ограничения использования этого метода говорят сами за себя.»

я снова редактировал свой пост, чтобы показать, как мне удается несколько песен с AVQueuePlayer. Эта часть кода работает.

0
AVAsset *asset; 
NSArray *playerTracks; 
NSMutableArray *playerParams; 
AVMutableAudioMix *muteAudioMix; 
for (int k=0; k<[[audio items] count]; k++) 
    { 
     //disable audio (this is the version when you have more than one video in the playlist: i write this version so it should be more useful) 
     asset = [AVURLAsset URLAssetWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:[soundfile objectAtIndex:k+([soundfile count]-[[audio items] count])] ofType:@"mp3"]] options:nil]; 

     playerTracks = [asset tracksWithMediaType:AVMediaTypeAudio]; 
     playerParams = [NSMutableArray array]; 
     for (AVAssetTrack *track in playerTracks) { 
      AVMutableAudioMixInputParameters *audioInputParams = [AVMutableAudioMixInputParameters audioMixInputParameters]; 
      [audioInputParams setVolume:1.0 atTime:kCMTimeZero]; 
      [audioInputParams setTrackID:[track trackID]]; 
      [playerParams addObject:audioInputParams]; 
     } 
     muteAudioMix = [AVMutableAudioMix audioMix]; 
     [muteAudioMix setInputParameters:playerParams]; 

     [[[audio items] objectAtIndex:k] setAudioMix:muteAudioMix]; 
    } 
+0

Добавить флаг setvolume со значением ползунка, я не тестировал таким образом, но может решить вашу проблему. –