2015-03-19 4 views
0

Я стараюсь изменить время воспроизведения песни, которая воспроизводится с помощью ползунка.AVAudioEngine AudioFile Time Management

Моя проблема заключается в получении точной 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)> 

Что я делаю неправильно?

ответ

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 (в секундах) - это позиция в песне, с которой вы хотите начать.

+0

Да. atTime означает, что мы планируем файл в это время в будущем, чтобы начать играть. –

+0

func createStartTime() -> AVAudioTime? { var время: AVAudioTime? , если позволить lastPlayer = self.trackPlayerDictionary [lastPlayerKey] { , если позволить SampleRate = lastPlayer.file .processingFormat.sampleRate { вар sampleTime = AVAudioFramePosition (shortStartDelay * SampleRate) время = AVAudioTime (hostTime: mach_absolute_time(), sampleTime: sampleTime, atRate: sampleRate) } } время возврата } –

+0

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

Смежные вопросы