SwiftUI | コントロールセンターのシークバーで音声ファイルの再生位置を制御する方法

音声・動画

SwiftUIでコントロールセンターのシークバーで音声ファイルの再生位置を制御する方法を説明する。

Swift 5.7 / Xcode 14.0 / iOS 16.0

結論

MPNowPlayingInfoCenter に以下を設定する。

  • MPNowPlayingInfoPropertyElapsedPlaybackTime(音声ファイルの現在の再生位置)
  • MPMediaItemPropertyPlaybackDuration(音声ファイルの長さ)

MPRemoteCommandCenter に以下を設定する。

  • changePlaybackPositionCommand(シークバー)

具体例

コントロールセンターのシークバーで音声ファイルの再生位置を制御できるAppを作成する。

App起動時の画面

ボタンをタップすると音声が再生される。コントロールセンターを表示させるとシークバーで音声ファイルの再生位置を制御できる。

コード

こちらの記事のコードをベースに以下のコードを追加する。

  1. MPNowPlayingInfoPropertyElapsedPlaybackTime(音声ファイルの現在の再生位置)
  2. MPMediaItemPropertyPlaybackDuration(音声ファイルの長さ)
  3. changePlaybackPositionCommand(シークバー)
import SwiftUI
import AVFoundation
import MediaPlayer

struct ContentView: View {
    var body: some View {
        let プレイヤークラス = playerClass()
        Button("音声を再生") {
            プレイヤークラス.プレイヤー.play()
        }
        .buttonStyle(.borderedProminent)
    }
}


class playerClass {
    var プレイヤー: AVAudioPlayer
    init() {
        let ファイルURL = Bundle.main.url(forResource: "sample",
                                         withExtension: "mp3")!
        プレイヤー = try! AVAudioPlayer(contentsOf: ファイルURL)
        setNowPlayingInfo()
        setMPRemoteCommandCenter()
    }
    
    func setNowPlayingInfo() {
        var nowPlayingInfo = [String : Any]()
        nowPlayingInfo[MPMediaItemPropertyTitle] = "タイトル"
        nowPlayingInfo[MPMediaItemPropertyAlbumTitle] = "アルバム"
        // 👇 1
        nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = プレイヤー.currentTime
        // 👇 2
        nowPlayingInfo[MPMediaItemPropertyPlaybackDuration] = プレイヤー.duration
        nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = プレイヤー.rate
        
        MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo
    }
    
    func setMPRemoteCommandCenter() {
        // Get the shared command center.
        let commandCenter = MPRemoteCommandCenter.shared()
        
        // 再生/停止/次に進む/前に戻るコマンド
        commandCenter.playCommand.addTarget { [unowned self] event in
            print("play")
            プレイヤー.play()
            return .success
        }
        commandCenter.pauseCommand.addTarget { [unowned self] event in
            print("pause")
            プレイヤー.pause()
            return .success
        }
        commandCenter.nextTrackCommand.addTarget{ [unowned self] event in
            print("next")
            // ここに次の曲に進む処理を記述
            return .success
        }
        commandCenter.previousTrackCommand.addTarget{ [unowned self] event in
            print("previous")
            // ここに前の曲に戻る処理を記述
            return .success
        }
        // 👇 3
        commandCenter.changePlaybackPositionCommand.addTarget { (event) -> MPRemoteCommandHandlerStatus in
            if let changePlaybackPositionCommandEvent = event as? MPChangePlaybackPositionCommandEvent
            {
                let positionTime = changePlaybackPositionCommandEvent.positionTime
                self.プレイヤー.currentTime = positionTime
            }
            return .success
        }
    }
    
}

まとめ

SwiftUIでコントロールセンターのシークバーで音声ファイルの再生位置を制御する方法を説明した。

コメント

タイトルとURLをコピーしました