You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已实现Spotify歌曲播放功能,如何修改歌曲BPM值?

修改Spotify歌曲BPM的实现方法

首先明确:Spotify官方SDK并未提供直接修改歌曲BPM的API,这类功能是通过本地音频实时处理实现的——获取Spotify音频流后,对音频数据做「变速不变调」处理,以此调整BPM。

核心逻辑

BPM对应歌曲的节拍速度,修改BPM本质是在保持音调不变的前提下调整播放速度。比如原BPM为120,要改成140,只需将播放速度提升至原速的 140/120≈1.167 倍即可。

具体实现步骤

1. 获取Spotify原始音频数据

通过Spotify SDK的音频回调接口获取实时PCM格式音频流:

  • iOS端:使用SPTAudioStreamingController的代理方法接收音频样本
func audioStreaming(_ audioStreaming: SPTAudioStreamingController, didReceive audioSample: NSData, numberOfChannels: UInt32, sampleRate: UInt32) {
    // 在此获取原始PCM音频数据,用于后续处理
}
  • Android端:通过SpotifyAppRemote的PlayerApi设置音频帧监听,拿到原始音频数据

2. 用第三方音频库做变速处理

选择支持「变速不变调」的音频库,常见选项:

  • iOS:SoundTouch、AVFoundation的AVAudioEngine
  • Android:SoundTouch、ExoPlayer变速扩展

以iOS的AVAudioEngine为例实现变速:

// 初始化音频引擎与播放器节点
let engine = AVAudioEngine()
let playerNode = AVAudioPlayerNode()
engine.attach(playerNode)

// 创建变速效果器,设置变速比例
let timePitch = AVAudioUnitTimePitch()
timePitch.rate = 1.2 // 速度为原速的1.2倍,对应BPM提升20%
engine.attach(timePitch)

// 连接音频节点
engine.connect(playerNode, to: timePitch, format: nil)
engine.connect(timePitch, to: engine.outputNode, format: nil)

// 将Spotify获取的PCM数据传入播放器节点播放
playerNode.scheduleBuffer(audioBuffer, at: nil, options: .interruptsAtLoop, completionHandler: nil)
try? engine.start()

3. 关联BPM数值与变速比例

先通过Spotify Web API获取歌曲原始BPM:调用GET /tracks/{id}接口,在audio_features字段中拿到tempo值(即BPM)。再计算变速比例:

变速比例 = 目标BPM / 原始BPM

将该比例传入音频处理库的变速参数即可。

4. 优化播放体验

  • 控制音频处理延迟,避免卡顿或音画不同步
  • 调整变速参数时做平滑过渡,避免速度突变

注意事项

  • 该处理仅在应用本地播放时生效,不会修改Spotify服务器上的歌曲数据
  • 需遵守Spotify开发者条款,处理后的音频仅用于个人播放,不得分发或存储

内容的提问来源于stack exchange,提问作者Sham Dhiman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 12:20:54