UISlider控制AVAudioPlayer

Dav*_*lak 33 iphone objective-c avaudioplayer uislider

我正在尝试在我的应用程序中实现一个小功能.我目前正在播放声音作为AVAudioPlayers并且工作正常.我想补充的是用UISlider控制声音的位置(currentTime):有一个简单的方法吗?

我查看了一个Apple项目,但它非常混乱....你有样品或建议吗?

感谢大家提前

Pau*_*nch 51

应该不是问题 - 只需将滑块设置为连续,并在加载声音文件后将最大值设置为播放器的持续时间.

编辑

我刚刚这样做,它对我有用......

- (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];
}
Run Code Online (Sandbox Code Playgroud)

滑块在IB中配置,以及开始播放的按钮.

Swift 3.0更新:

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)
}
Run Code Online (Sandbox Code Playgroud)


Noa*_*oon 16

要扩展paull的答案,你可以将滑块设置为连续的音频播放器的最大值duration,然后添加你的一些对象(可能是视图控制器)作为滑块UIControlEventValueChanged事件的目标; 当您收到操作消息时,您可以将AVAudioPlayer's currentTime属性设置为滑块的值.您可能还想使用a NSTimer来更新滑块的值,因为音频播放器会播放; +scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:是最简单的方法.


小智 7

我需要稍微调整上面的答案才能让它发挥作用.问题是使用

slider.maximumValue = [player duration];
slider.value = player.currentTime;
player.currentTime = slider.value;
Run Code Online (Sandbox Code Playgroud)

不起作用,因为滑块需要浮动,播放器currentTime和dration返回CMTime.为了使这些工作,我改编他们阅读:

slider.maximumValue = CMTimeGetSeconds([player duration]);
slider.value = CMTimeGetSeconds(player.currentTime);
player.currentTime = CMTimeMakeWithSeconds((int)slider.value,1);
Run Code Online (Sandbox Code Playgroud)