0

現在、スライダーで再生中の曲の再生時間を変更しようとしています。

私の問題は、スライダーに基づいて再生をスケジュールするための正確な 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)>

私は何を間違っていますか?

4

1 に答える 1

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 (秒単位) は、開始したい曲の位置です。

于 2015-07-24T07:21:47.983 に答える