iOS音乐播放器实现代码完整版

发布时间:2026-09-28 18:27:52 浏览次数:1

“iOS音乐播放器实现代码完整版”是一篇关于在iOS平台上实现音乐播放器的完整教程,以下是该攻略的详细讲解:

1. 概述

本文将详细介绍在iOS平台开发一个完整的音乐播放器所需的代码实现步骤。我们将会使用Apple提供的AVFoundation框架来完成音频的播放、暂停、停止、快进、快退、调整音量等基本操作,并且在界面上展示当前音频的播放进度、歌曲信息、专辑封面等信息。

2. 准备工作

在开始之前,我们需要准备以下工作:

  • Xcode开发环境
  • 一份音频资源文件(可以是本地文件或者网络文件)

另外,我们还需要在项目中引入AVFoundation框架,并在代码中导入相关的头文件。

3. 实现过程

本教程将基于MVC架构来实现音乐播放器。具体实现步骤如下:

3.1 模型层

我们使用一个名为MusicModel的模型类来存储音频的相关信息,如歌曲名、歌手、专辑名、歌曲路径等。该类的部分代码如下:

class MusicModel {    var musicTitle: String     // 歌曲名    var musicArtist: String    // 歌手名    var musicAlbum: String     // 专辑名    var musicPath: String      // 歌曲文件路径    init(title: String, artist: String, album: String, path: String) {        self.musicTitle = title        self.musicArtist = artist        self.musicAlbum = album        self.musicPath = path    }}

3.2 控制器层

3.2.1 播放控制器

我们使用一个名为MusicPlayerViewController的控制器来控制音乐的播放、暂停、停止、快进、快退、调整音量等操作。该控制器的部分代码如下:

class MusicPlayerViewController: UIViewController {    // 模型层    var musicModel: MusicModel?    // AVPlayer实例    private var player: AVPlayer?    override func viewDidLoad() {        super.viewDidLoad()        // 初始化AVPlayer实例        if let path = musicModel?.musicPath {            let url = URL(fileURLWithPath: path)            player = AVPlayer(url: url)        }    }    func play() {        player?.play()    }    func pause() {        player?.pause()    }    func stop() {        player?.pause()        player?.seek(to: CMTime.zero)    }    func fastForward() {        let currentTime = player?.currentTime()        let timeToAdd = CMTime(value: 15, timescale: 1)        player?.seek(to: currentTime! + timeToAdd)    }    func rewind() {        let currentTime = player?.currentTime()        let timeToSubtract = CMTime(value: 15, timescale: 1)        player?.seek(to: currentTime! - timeToSubtract)    }    func volume(_ value: Float) {        player?.volume = value    }}

3.2.2 播放界面控制器

我们使用一个名为MusicPlayViewController的控制器来展示音乐的播放状态、歌曲封面、歌曲信息等,并且通过调用MusicPlayerViewController中的方法来实现音乐的播放、暂停、停止、快进、快退、调整音量等操作。该控制器的部分代码如下:

class MusicPlayViewController: UIViewController {    // 模型层    var musicModel: MusicModel?    // 控制器层    let musicPlayerVC = MusicPlayerViewController()    // 歌曲封面ImageView    let musicCoverImageView: UIImageView = {        let imageView = UIImageView()        imageView.translatesAutoresizingMaskIntoConstraints = false        imageView.image = UIImage(named: "default")        imageView.contentMode = .scaleAspectFit        imageView.clipsToBounds = true        return imageView    }()    // 歌曲信息UILabel    let musicInfoLabel: UILabel = {        let label = UILabel()        label.translatesAutoresizingMaskIntoConstraints = false        label.font = UIFont.systemFont(ofSize: 17)        label.textColor = .black        label.numberOfLines = 0        label.textAlignment = .center        return label    }()    override func viewDidLoad() {        super.viewDidLoad()        // 设置背景色        view.backgroundColor = .white        // 添加子视图        view.addSubview(musicCoverImageView)        view.addSubview(musicInfoLabel)        // 添加约束        musicCoverImageView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true        musicCoverImageView.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: -100).isActive = true        musicCoverImageView.widthAnchor.constraint(equalToConstant: 250).isActive = true        musicCoverImageView.heightAnchor.constraint(equalToConstant: 250).isActive = true        musicInfoLabel.topAnchor.constraint(equalTo: musicCoverImageView.bottomAnchor, constant: 20).isActive = true        musicInfoLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20).isActive = true        musicInfoLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20).isActive = true        // 更新UI界面        updateUI()    }    // 更新UI界面    func updateUI() {        if let model = musicModel {            musicCoverImageView.image = UIImage(named: model.musicAlbum)            musicInfoLabel.text = "\(model.musicTitle)\n\(model.musicArtist)\n\(model.musicAlbum)"            // 设置播放器的模型层            musicPlayerVC.musicModel = model        }    }    // 播放按钮的动作    @IBAction func playButtonAction(_ sender: UIButton) {        musicPlayerVC.play()    }    // 暂停按钮的动作    @IBAction func pauseButtonAction(_ sender: UIButton) {        musicPlayerVC.pause()    }    // 停止按钮的动作    @IBAction func stopButtonAction(_ sender: UIButton) {        musicPlayerVC.stop()    }    // 快进按钮的动作    @IBAction func fastForwardButtonAction(_ sender: UIButton) {        musicPlayerVC.fastForward()    }    // 快退按钮的动作    @IBAction func rewindButtonAction(_ sender: UIButton) {        musicPlayerVC.rewind()    }    // 音量调节的动作    @IBAction func volumeSliderAction(_ sender: UISlider) {        musicPlayerVC.volume(sender.value)    }}

3.3 视图层

3.3.1 播放界面视图

我们使用一个名为MusicPlayView的视图来展示音乐播放器的界面,并通过调用MusicPlayViewController中的方法来实现音乐的播放、暂停、停止、快进、快退、调整音量等操作。该视图的部分代码如下:

class MusicPlayView: UIView {    // 模型层    var musicModel: MusicModel?    // 控制器层    var musicPlayVC: MusicPlayViewController?    // 播放按钮    let playButton: UIButton = {        let button = UIButton()        button.translatesAutoresizingMaskIntoConstraints = false        button.setTitle("播放", for: .normal)        button.setTitleColor(.black, for: .normal)        button.addTarget(self, action: #selector(playButtonAction), for: .touchUpInside)        return button    }()    // 暂停按钮    let pauseButton: UIButton = {        let button = UIButton()        button.translatesAutoresizingMaskIntoConstraints = false        button.setTitle("暂停", for: .normal)        button.setTitleColor(.black, for: .normal)        button.addTarget(self, action: #selector(pauseButtonAction), for: .touchUpInside)        return button    }()    // 停止按钮    let stopButton: UIButton = {        let button = UIButton()        button.translatesAutoresizingMaskIntoConstraints = false        button.setTitle("停止", for: .normal)        button.setTitleColor(.black, for: .normal)        button.addTarget(self, action: #selector(stopButtonAction), for: .touchUpInside)        return button    }()    // 快进按钮    let fastForwardButton: UIButton = {        let button = UIButton()        button.translatesAutoresizingMaskIntoConstraints = false        button.setTitle("快进", for: .normal)        button.setTitleColor(.black, for: .normal)        button.addTarget(self, action: #selector(fastForwardButtonAction), for: .touchUpInside)        return button    }()    // 快退按钮    let rewindButton: UIButton = {        let button = UIButton()        button.translatesAutoresizingMaskIntoConstraints = false        button.setTitle("快退", for: .normal)        button.setTitleColor(.black, for: .normal)        button.addTarget(self, action: #selector(rewindButtonAction), for: .touchUpInside)        return button    }()    // 音量调节滑块    let volumeSlider: UISlider = {        let slider = UISlider()        slider.translatesAutoresizingMaskIntoConstraints = false        slider.minimumValue = 0        slider.maximumValue = 1        slider.addTarget(self, action: #selector(volumeSliderAction), for: .valueChanged)        return slider    }()    override init(frame: CGRect) {        super.init(frame: frame)        // 添加子视图        addSubview(playButton)        addSubview(pauseButton)        addSubview(stopButton)        addSubview(fastForwardButton)        addSubview(rewindButton)        addSubview(volumeSlider)        // 添加约束        playButton.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true        playButton.topAnchor.constraint(equalTo: topAnchor, constant: 20).isActive = true        pauseButton.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 20).isActive = true        pauseButton.topAnchor.constraint(equalTo: playButton.bottomAnchor, constant: 20).isActive = true        stopButton.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -20).isActive = true        stopButton.topAnchor.constraint(equalTo: playButton.bottomAnchor, constant: 20).isActive = true        fastForwardButton.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true        fastForwardButton.topAnchor.constraint(equalTo: pauseButton.bottomAnchor, constant: 20).isActive = true        rewindButton.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true        rewindButton.topAnchor.constraint(equalTo: fastForwardButton.bottomAnchor, constant: 20).isActive = true        volumeSlider.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 20).isActive = true        volumeSlider.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -20).isActive = true        volumeSlider.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -20).isActive = true    }    // 更新UI界面    func updateUI() {        if let model = musicModel {            // 设置控制器层的模型层            musicPlayVC?.musicModel = model        }    }    // 播放按钮的动作    @IBAction func playButtonAction(_ sender: UIButton) {        musicPlayVC?.playButtonAction(sender)    }    // 暂停按钮的动作    @IBAction func pauseButtonAction(_ sender: UIButton) {        musicPlayVC?.pauseButtonAction(sender)    }    // 停止按钮的动作    @IBAction func stopButtonAction(_ sender: UIButton) {        musicPlayVC?.stopButtonAction(sender)    }    // 快进按钮的动作    @IBAction func fastForwardButtonAction(_ sender: UIButton) {        musicPlayVC?.fastForwardButtonAction(sender)    }    // 快退按钮的动作    @IBAction func rewindButtonAction(_ sender: UIButton) {        musicPlayVC?.rewindButtonAction(sender)    }    // 音量调节的动作    @IBAction func volumeSliderAction(_ sender: UISlider) {        musicPlayVC?.volumeSliderAction(sender)    }}

3.4 如何使用

我们在主视图控制器中创建一个名为MusicPlayView的实例,并将它添加到视图控制器的视图中。同时,我们还需要为该视图添加约束以使其能够正常显示。

3.4.1 示例一

在viewDidLoad方法中创建一个名为musicPlayView的实例,并将其添加到视图控制器的视图中:

class ViewController: UIViewController {    let musicPlayView = MusicPlayView()    override func viewDidLoad() {        super.viewDidLoad()        // 添加子视图        view.addSubview(musicPlayView)        // 添加约束        musicPlayView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true        musicPlayView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true        musicPlayView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true        musicPlayView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true        // 加载示例音乐        loadSampleMusic()    }    // 加载示例音乐    func loadSampleMusic() {        let path = Bundle.main.path(forResource: "sample", ofType: "mp3")!        let musicModel = MusicModel(title: "The Sound of Silence", artist: "Simon & Garfunkel", album: "The Graduate", path: path)        // 设置视图层的模型层        musicPlayView.musicModel = musicModel        // 设置控制器层的模型层        musicPlayView.musicPlayVC?.musicModel = musicModel        // 更新UI界面        musicPlayView.updateUI()    }}

3.4.2 示例二

在故事板中拖拽一个名为MusicPlayView的视图,并将其与一个名为MusicPlayViewController的视图控制器关联。在MusicPlayViewController.swift文件中,添加以下代码:

class MusicPlayViewController: UIViewController {    @IBOutlet weak var musicPlayView: MusicPlayView!    var musicModel: MusicModel?    override func viewDidLoad() {        super.viewDidLoad()        // 更新UI界面        musicPlayView.updateUI()    }    // 视图出现时加载音乐    override func viewWillAppear(_ animated: Bool) {        guard let model = musicModel else { return }        // 设置视图层的模型层        musicPlayView.musicModel = model        // 设置控制器层的模型层        musicPlayView.musicPlayVC?.musicModel = model    }    @IBAction func playButtonAction(_ sender: UIButton) {        musicPlayView.musicPlayVC?.play()    }    @IBAction func pauseButtonAction(_ sender: UIButton) {        musicPlayView.musicPlayVC?.pause()    }    @IBAction func stopButtonAction(_ sender: UIButton) {        musicPlayView.musicPlayVC?.stop()    }    @IBAction func fastForwardButtonAction(_ sender: UIButton) {        musicPlayView.musicPlayVC?.fastForward()    }    @IBAction func rewindButtonAction(_ sender: UIButton) {        musicPlayView.musicPlayVC?.rewind()    }    @IBAction func volumeSliderAction(_ sender: UISlider) {        musicPlayView.musicPlayVC?.volume(sender.value)    }}

在故事板中将MusicPlayView中的每一个按钮与MusicPlayViewController.swift文件中的相应方法进行关联即可。

需要做网站?需要网络推广?欢迎咨询客户经理 13272073477