AVAudioEngine Управление временем аудиофайлов

В настоящее время я пытаюсь изменить время воспроизведения песни, которая воспроизводится с помощью ползунка.

Моя проблема заключается в получении точного AVAudioTime для планирования воспроизведения на основе ползунка.

Код (быстро) выглядит так:

@IBAction func ChangeAudioTime(sender: AnyObject) {

 //get current sampleRate of song already playing


 var nodetime: AVAudioTime  = self.playerNode.lastRenderTime


 var playerTime: AVAudioTime = self.playerNode.playerTimeForNodeTime(nodetime)


 playerNode.stop()

 var time: NSTimeInterval = NSTimeInterval(Slider.value)

 var hostTime = AVAudioTime.hostTimeForSeconds(time)

 var sampleTime = AVAudioFramePosition(hosttime/UInt64(playerTime.sampleRate))

 var ExampleTime: AVAudioTime = AVAudioTime(hostTime:hostTime, sampleTime: sampleTime, atRate: playerTime.sampleRate)


 playerNode.scheduleFile(audioFile, atTime:ExampleTime, completionHandler:nil)

      playerNode.play()
}

Максимальное значение ползунка соответствует длине песни, так что это не проблема.

Песня просто начинает играть с самого начала

Вывод ExampleTime в консоли:

<AVAudioTime 0x1702b4160: 147.874222 s 80475 fr (/44100 Hz)>

Что я делаю не так?


person Paul Lehn    schedule 19.03.2015    source источник


Ответы (1)


Я думаю, это то, что вам нужно:

-(void)playAtTime:(AVAudioTime*)aTime {

startingFrame = _currentTime * self.file.processingFormat.sampleRate;
AVAudioFrameCount frameCount = (AVAudioFrameCount)(self.file.length - startingFrame);

    [_player scheduleSegment:self.file
               startingFrame:startingFrame
                  frameCount:frameCount
                      atTime:aTime
           completionHandler:^{
                NSLog(@"done playing");//actually done scheduling.
            }];
    [_player play];


}

scheduleFile:atTime фактически воспроизводит весь файл, atTime — это когда он запускается. Я все еще выясняю, как это работает. Это должно быть время в будущем,

В примере _currentTime (в секундах) — это позиция в песне, с которой вы хотите начать.

person Johan Velthuis    schedule 24.07.2015
comment
да. atTime означает, что мы планируем начать воспроизведение файла в это время в будущем. - person Abdul Yasin; 21.12.2016
comment
func createStartTime() -> AVAudioTime? { var time:AVAudioTime? if let lastPlayer = self.trackPlayerDictionary[lastPlayerKey] { if let sampleRate = lastPlayer.file?.processingFormat.sampleRate { var sampleTime = AVAudioFramePosition(shortStartDelay * sampleRate) time = AVAudioTime(hostTime: mach_absolute_time(), sampleTime: sampleTime, atRate: sampleRate ) } } время возврата } - person Johan Velthuis; 22.12.2016
comment
Это то, что я использую, чтобы создать время в ближайшем будущем для точного планирования. Затем я использую это же время несколько раз для синхронизации нескольких игроков. - person Johan Velthuis; 22.12.2016