アプリに小さな機能を実装しようとしています。現在、AVAudioPlayers としてサウンドを再生していますが、問題なく動作しています。追加したいのは、UISlider を使用してサウンドの位置 (currentTime) を制御することです。それを行う簡単な方法はありますか?
Apple プロジェクトを見ましたが、かなり面倒でした....サンプルや提案はありますか?
事前にみんなに感謝
アプリに小さな機能を実装しようとしています。現在、AVAudioPlayers としてサウンドを再生していますが、問題なく動作しています。追加したいのは、UISlider を使用してサウンドの位置 (currentTime) を制御することです。それを行う簡単な方法はありますか?
Apple プロジェクトを見ましたが、かなり面倒でした....サンプルや提案はありますか?
事前にみんなに感謝
問題はないはずです。スライダーを連続に設定し、サウンドファイルをロードした後のプレーヤーの持続時間に最大値を設定するだけです。
編集
私はちょうどこれをしました、そしてそれは私のために働きます...
- (IBAction)slide {
player.currentTime = slider.value;
}
- (void)updateTime:(NSTimer *)timer {
slider.value = player.currentTime;
}
- (IBAction)play:(id)sender {
NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"sound.caf" ofType:nil]];
NSError *error;
player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
if (!player) NSLog(@"Error: %@", error);
[player prepareToPlay];
slider.maximumValue = [player duration];
slider.value = 0.0;
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTime:) userInfo:nil repeats:YES];
[player play];
}
スライダーは、再生を開始するためのボタンと同様に、IBで構成されています。
var player: AVAudioPlayer!
var sliderr: UISlider!
@IBAction func play(_ sender: Any) {
var url = URL(fileURLWithPath: Bundle.main.path(forResource: "sound.caf", ofType: nil)!)
var error: Error?
do {
player = try AVAudioPlayer(contentsOf: url)
}
catch let error {
}
if player == nil {
print("Error: \(error)")
}
player.prepareToPlay()
sliderr.maximumValue = Float(player.duration)
sliderr.value = 0.0
Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(self.updateTime), userInfo: nil, repeats: true)
player.play()
}
func updateTime(_ timer: Timer) {
sliderr.value = Float(player.currentTime)
}
@IBAction func slide(_ slider: UISlider) {
player.currentTime = TimeInterval(slider.value)
}
ポールの答えを拡張するには、スライダーをオーディオプレーヤーの最大値で連続するように設定し、スライダーのイベントduration
のターゲットとしてオブジェクト(おそらくビューコントローラー)を追加します。UIControlEventValueChanged
アクション メッセージを受け取ったら、AVAudioPlayer
のcurrentTime
プロパティをスライダーの値に設定します。を使用しNSTimer
て、オーディオ プレーヤーの再生時にスライダーの値を更新することもできます。+scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:
それを行う最も簡単な方法です。
私はそれを機能させるために上記の答えを少し適応させる必要がありました。問題は、
slider.maximumValue = [player duration];
slider.value = player.currentTime;
player.currentTime = slider.value;
スライダーはfloatを想定しており、プレーヤーのcurrentTimeとdrationはCMTimeを返すため、機能しません。これらを機能させるために、私はそれらを次のように適応させました。
slider.maximumValue = CMTimeGetSeconds([player duration]);
slider.value = CMTimeGetSeconds(player.currentTime);
player.currentTime = CMTimeMakeWithSeconds((int)slider.value,1);