iOS остановить воспроизведение аудио в определенное время (время окончания AVAudioPlayer) - PullRequest
5 голосов
/ 18 августа 2011

Я хочу воспроизвести только часть аудиофайла.Этот аудиофайл содержит 232 произнесенных слова, у меня есть словарь, который содержит время начала каждого слова.Так что у меня есть время начала и окончания, но я просто не могу найти способ остановиться в данное время или воспроизвести файл в течение определенной продолжительности.Спасибо за советы и / или примеры кода, которые будут мне полезны, спасибо Джейсону.

Итак, я нашел решение, есть проблема с тем, как я получаю endTime, но я уверен, что смогу это исправить.

//Prepare to play
[audioPlayer prepareToPlay];

//Get current time from the array using selected word
audioPlayer.currentTime = [[wordsDict objectForKey:selectedWord] floatValue]; 

//Find end time  - this is a little messy for now
int currentIndex = 0;
int count = 0;

for (NSString* item in wordsKeys) {
    if ([item isEqualToString: selectedWord]) {
        currentIndex = count+1;
    }
    count++;
}

//Store found end time
endTime  = [[wordsDict objectForKey:[wordsKeys objectAtIndex:currentIndex]] floatValue];

//Start Timer
NSTimer * myAudioTimer = [NSTimer scheduledTimerWithTimeInterval:0.1
                                                             target:self
                                                           selector:@selector(checkCurrentTime)
                                                           userInfo:nil
                                                            repeats:YES]
//Now play audio
[audioPlayer play];



//Stop at endTime
- (void) checkCurrentTime {
if(audioPlayer.playing && audioPlayer.currentTime >= endTime)
    [audioPlayer stop];
}

Ответы [ 3 ]

13 голосов
/ 01 декабря 2011

Это должно делать то, что вы хотите. вам не нужен повторяющийся таймер, который бьет игрока.

NSString *myAudioFileInBundle = @"words.mp3";
NSTimeInterval wordStartsAt = 1.8;
NSTimeInterval wordEndsAt = 6.5;
NSString *filePath = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:myAudioFileInBundle];
NSURL *myFileURL = [NSURL fileURLWithPath:filePath];
AVAudioPlayer *myPlayer = [[AVAudioPlayer alloc]initWithContentsOfURL:myFileURL error:nil];
if (myPlayer) 
{
    [myPlayer setCurrentTime:wordStartsAt];
    [myPlayer prepareToPlay];
    [myPlayer play];
    [NSTimer scheduledTimerWithTimeInterval:wordEndsAt-wordStartsAt target:myPlayer.autorelease selector:@selector(stop) userInfo:nil repeats:NO];

}
4 голосов
/ 14 апреля 2015

Попробуйте вместо этого использовать AVPlayer и используйте

addBoundaryTimeObserverForTimes: queue: usingBlock:

Что он делает: Запрашивает вызов блока, когда во время нормального воспроизведения просматривается указанное время.

https://developer.apple.com/library/prerelease/ios/documentation/AVFoundation/Reference/AVPlayer_Class/index.html#//apple_ref/occ/instm/AVPlayer/addBoundaryTimeObserverForTimes:queue:usingBlock:

0 голосов
/ 18 августа 2011

AVAudioPlayer дает вам несколько полезных свойств для работы:

  • currentTime: во время воспроизведения вы можете положиться на это свойство.

  • playAtTime: воспроизведение начинается с заранее установленного времени.


Но прежде всего я бы написал несколько помощников для этого:

@interface Word {
    double startTime;
    double endTime;
}

@property double startTime;  
@property double endTime;  

@end

Это просто класс для простой работы со следующим методом.

- (void)playWord:(Word *)aWord {

    self.avPlayer.playAtTime = aWord.startTime;
    [avPlayer prepareToPlay];
    [avPlayer play];

    while (avPlayer.playing) {
        /*
        This while loop could be dangerous as it could go on for a long time.
        But because we're just evaluating words, it won't be as much power draining
        */

        if(avPlayer.currentTime >= aWord.endTime;
        [avPlayer stop];
    }
}

Я бы предложил вам использовать массив или любой другой механизм для автоматического переключения на следующее слово. Может быть, вы могли бы также добавить кнопки «Предыдущий» и «Следующий» для обработки пользовательского ввода.

Пожалуйста, дайте мне знать, если это сработало для вас.

НТН

...