如何使 UISlider 匹配音频进度

     2023-03-13     244

关键词:

【中文标题】如何使 UISlider 匹配音频进度【英文标题】:How To Make UISlider match Audio progress 【发布时间】:2017-03-07 14:43:51 【问题描述】:

我正在创建一个简单的音乐应用程序,我想知道如何制作一个 UiSlider 来跟踪音频文件的进度。到目前为止,这是我的项目:

代码:

import UIKit
import AVFoundation

class SongDetailViewController: UITableViewController 

    var audioPlayer = AVAudioPlayer()

    override func viewDidLoad() 
        super.viewDidLoad()

        do 
            audioPlayer = try AVAudioPlayer(contentsOf: URL.init(fileURLWithPath: Bundle.main.path(forResource: "Song Name", ofType: "mp3")!))
            audioPlayer.prepareToPlay()

            var audioSession = AVAudioSession.sharedInstance()

            do 
                try audioSession.setCategory(AVAudioSessionCategoryPlayback)
            
        

        catch 
            print(error)
        
    
//    Buttons

//    Dismiss
    @IBAction func dismiss(_ sender: Any) 
        dismiss(animated: true, completion: nil)
    

//    Play
    @IBAction func play(_ sender: Any) 
        audioPlayer.stop()
        audioPlayer.play()
    

//    Pause
    @IBAction func pause(_ sender: Any) 
        audioPlayer.pause()
    

//    Restart
    @IBAction func restart(_ sender: Any) 
        audioPlayer.currentTime = 0
    


我想创建类似于 Apple Music 应用程序的 uislider,它会跟踪音频文件的进度,并且每当用户滑动球的东西(大声笑)时,它就会转到歌曲的那个时间。如果你能给我一些代码来完成这个,那就太棒了!

请记住,我对编码还很陌生,并且仍在快速学习,所以请保持简单 :-) 再次感谢!

【问题讨论】:

【参考方案1】:

如果您改用AVPlayer,您可以将periodicTimeObserver 添加到您的AVPlayer。在下面的示例中,您将每 1/30 秒收到一次回调……

let player = AVPlayer(url: Bundle.main.url(forResource: "Song Name", withExtension: "mp3")!)

player.addPeriodicTimeObserver(forInterval: CMTimeMake(1, 30), queue: .main)  time in

    let fraction = CMTimeGetSeconds(time) / CMTimeGetSeconds(player.currentItem!.duration)

    self.slider.value = fraction

您在代码中创建audioPlayer 的地方,替换为上面的代码。

【讨论】:

好的,那么,你能把我上面的代码放到100%完成的地方吗?如果您需要为滑块放置一个 IB 插座,也将其放入其中。那样可以么?非常感谢!! 您认为您可以自己尝试一下,如果仍有问题,请更新您的问题? 更新了我的答案。期望 SO 上的人为您完成工作是一种不好的形式。您需要自己尝试一下,然后在遇到问题时询问。 "...你能把我上面的代码放到 100% 完成的地方吗?"你开玩笑的对吧? “你能为我做我所有的工作吗?” “我的车需要洗,你介意吗?”这不是其他人为您工作的网站。付出一些努力,我们会为您提供帮助,但不要要求将解决方案交给玩具“100% 完成”。【参考方案2】:

使用AVAudioPlayer,您可以创建一个周期性计时器,该计时器每秒触发数次(最多60 次/秒- 再多就浪费了),并根据您的音频播放器的currentTime 属性更新您的滑块。要将更新与屏幕刷新同步,您可以使用 CADisplayLink 计时器。


编辑:

我的这部分答案不起作用:

还应该可以在您的设备上设置一个 Key Value Observer AVAudioPlayers currentTime 属性使每次的值 改变你的观察者火力。 (我没有尝试过,但它应该 工作。)


【讨论】:

很确定 currentTime 不支持 KVO,除非事情发生了变化。他们的文档说 KVO 不适合持续的状态变化。 developer.apple.com/documentation/avfoundation/…

给 UISlider 进度条圆角 [Swift]

】给UISlider进度条圆角[Swift]【英文标题】:GiveUISliderprogressbarroundedcorners[Swift]【发布时间】:2020-07-0416:32:44【问题描述】:我想知道是否有人知道如何自定义UISlider以使进度条圆角(没有拇指图像),如下图所示:我想要什么:... 查看详情

如何使 Progressbar(UISlider) 在我的应用程序中动态工作? [复制]

】如何使Progressbar(UISlider)在我的应用程序中动态工作?[复制]【英文标题】:HowtomaketheProgressbar(UISlider)workdynamicallyinmyapp?[duplicate]【发布时间】:2011-09-2007:13:10【问题描述】:可能重复:UISlidertocontrolAVAudioPlayer我正在尝试为iPhone开... 查看详情

UISlider 进展不顺利

】UISlider进展不顺利【英文标题】:UISlidernotprogressingsmoothly【发布时间】:2017-03-2901:19:50【问题描述】:我有两个UIViewController,每个都有一个UISlider。一个滑块跟踪从AVPlayer播放的音频文件的进度,另一个视图控制器滑块跟踪从AV... 查看详情

具有缓冲进度的 UISlider - AVPlayer

】具有缓冲进度的UISlider-AVPlayer【英文标题】:UISliderwithbufferingprogress-AVPlayer【发布时间】:2018-08-3010:29:31【问题描述】:我正在使用AVPlayer从服务器流式传输音频,我现在要做的是显示一个自定义UISlider来显示缓冲的进度。有人... 查看详情

通过在 UISlider 中选择点来修剪音频文件

】通过在UISlider中选择点来修剪音频文件【英文标题】:TrimtheaudiofilebyselectingpointinUISlider【发布时间】:2013-09-0407:34:18【问题描述】:我正在开发一个音频播放器,我需要在其中显示正在播放的音频的进度。我还需要通过选择我... 查看详情

首次显示时如何使 UISlider 变粗?

】首次显示时如何使UISlider变粗?【英文标题】:HowtomakeUISliderthickerwhenitisfirstdisplayed?【发布时间】:2013-03-1523:23:14【问题描述】:我正在尝试制作一个具有胖轨道的UISlider。我试过this,它几乎可以工作。但是,当UISlider第一次显... 查看详情

如何自定义 UISlider 以使步骤可见

】如何自定义UISlider以使步骤可见【英文标题】:HowtocustomzeUISlidertogetsteppsvisible【发布时间】:2014-07-1319:29:13【问题描述】:我想自定义我的UISlider以便能够显示附加照片中的步骤(顺便说一句,这是一个字体大小选择器,来自... 查看详情

UISlider 不能与 AVPlayer 一起正常工作

】UISlider不能与AVPlayer一起正常工作【英文标题】:UISliderdoesnotworkcorrectlywithAVPlayer【发布时间】:2017-06-0209:14:28【问题描述】:我使用AVPlayer播放音频文件。我有问题。UISlider无法正常工作,滑块应作为进度视图移动,当您单击停... 查看详情

如何使 UISlider 以指数方式输出漂亮的舍入数字?

】如何使UISlider以指数方式输出漂亮的舍入数字?【英文标题】:HowtomakeUISlideroutputniceroundednumbersexponentially?【发布时间】:2010-05-1115:12:23【问题描述】:我正在实现一个UISlider,用户可以操纵它来设置距离。我没用过CocoaTouchUISlid... 查看详情

使用 AVAudioPlayer 进行 UISlider 更新

】使用AVAudioPlayer进行UISlider更新【英文标题】:MakeUISliderUpdatewithProgressUsingAVAudioPlayer【发布时间】:2018-01-1007:14:13【问题描述】:我正在制作一个简单的音频播放器应用,它允许用户使用UISlider更改他们在轨道中的位置。它没有... 查看详情

UIslider 和 UI 进度视图嵌入

】UIslider和UI进度视图嵌入【英文标题】:UIsliderandUIprogressviewembedded【发布时间】:2016-12-1208:51:16【问题描述】:我正在尝试构建一个嵌入在进度条中的滑块,以便滑块的最小图像与进度条“进度图像”一致,并且用户只能在“... 查看详情

AVPlayer 串流进度

...从服务器流式传输音频,我现在要做的是显示一个自定义UISlider,它显示缓冲的进度。类似这样的:对于AVPlayer,似乎无法获取音频文件的总下载大小或当前下载量,只能获取当前播放时间和总播放时间。有什么解决方法吗?【... 查看详情

UISlider 的自定义形状并在 Swift 5 中更新进度

】UISlider的自定义形状并在Swift5中更新进度【英文标题】:CustomshapetoUISliderandupdateprogressinSwift5【发布时间】:2021-02-1315:27:10【问题描述】:我已经检查了一些关于自定义UIView滑块的***答案,但使用它们我无法制作这样的滑块。这... 查看详情

制作进度条(uislider)

怎样判断是否应当使用进度条  用进度条的主要目的是为了用一根管子的充满程度来直观地表示某种数值的百分比,进度条分为可拖动和不可拖动两种。  可拖动进度条和不可拖动进度条的原理几乎是一模一样,唯一的区别... 查看详情

如何在 UISlider 中实现 sender.selected if 语句?

】如何在UISlider中实现sender.selectedif语句?【英文标题】:Howtoimplementsender.selectedifstatementintoUISlider?【发布时间】:2016-06-2309:54:36【问题描述】:我正在尝试创建一个滑块,它可以根据滑块的值更改音频。因此,例如,如果滑块值... 查看详情

uiprogressview和uislider

UIProgressView和UISlider两个控件长的很像,区别在于UISlider有一个可以改变进度的滑块。虽然样子差不多,提供的属性的功能也差不多,但是属性的名字差别比较大。UIProgressView和UISlider的属性对比UIProgressView控件的属性UISlider控件的... 查看详情

如何使用音频文件作为进度条更新 jslider

】如何使用音频文件作为进度条更新jslider【英文标题】:Howtoupdatejsliderwithanaudiofileasprogressbar【发布时间】:2013-04-0620:15:01【问题描述】:我有一个wav音频文件。我知道如何在java中使用AudioImputStream播放它。我学会了创建一个jslid... 查看详情

如何获得 UISlider 的默认 maximumTrackTintColor

】如何获得UISlider的默认maximumTrackTintColor【英文标题】:HowcanIgetthedefaultmaximumTrackTintColorforaUISlider【发布时间】:2014-12-2521:44:40【问题描述】:我正在尝试使UISlider在右侧具有淡色,在左侧具有暗色(交换它们)我能够在右侧获得... 查看详情