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

iOS应用音频播放器无法播放Digital Ocean Spaces存储的音频文件

解决iOS播放Digital Ocean Spaces音频时OSStatus 1685348671错误

错误原因解析

错误码1685348671(十六进制0x64617461)对应AVFoundation的音频格式/编码不兼容问题。网页浏览器对音频编码的容错性远高于iOS的AVAudioPlayer和VLC,说明你的MP3文件使用了iOS不支持的编码参数(比如非标准的LAME压缩配置、特殊比特率/采样率,或是MP3变体格式)。

解决步骤

1. 验证音频文件编码信息

用ffmpeg工具检查文件的编码细节,确认是否存在不兼容参数:

ffmpeg -i RE01d26d4b1f68485088ca35d3cd6fa340.mp3

重点看输出中Audio段的信息,比如:

Audio: mp3, 8000 Hz, mono, s16p, 32 kb/s

如果采样率低于8kHz、使用了特殊的比特率模式,或者编码不是标准的libmp3lame,就会导致iOS无法识别。

2. 重新转码为iOS兼容的MP3格式

使用ffmpeg将音频转码为iOS支持的标准MP3:

ffmpeg -i input.mp3 -codec:a libmp3lame -q:a 2 -ac 2 -ar 44100 output.mp3

参数说明:

  • -q:a 2:中等质量(0-9,数值越小质量越高)
  • -ac 2:双声道(兼容iOS全设备)
  • -ar 44100:44.1kHz采样率(iOS推荐的标准采样率)

将转码后的文件重新上传到Digital Ocean Spaces,再测试播放。

3. 替换AVAudioPlayer为AVPlayer(备选方案)

如果转码不可行,AVPlayer对非标准音频的兼容性比AVAudioPlayer更好,修改你的播放Helper类:

import AVFoundation
import UIKit

class MusicPlayerHelper: NSObject {
    static let shared = MusicPlayerHelper()
    private var player: AVPlayer?
    var musicCompleteEvent: (()->())?
    
    func loadAudio(from url: URL) {
        let playerItem = AVPlayerItem(url: url)
        player = AVPlayer(playerItem: playerItem)
        
        // 监听播放结束事件
        NotificationCenter.default.addObserver(self,
                                               selector: #selector(audioPlayerDidFinishPlaying),
                                               name: .AVPlayerItemDidPlayToEndTime,
                                               object: playerItem)
    }
    
    func getDurationSync() -> TimeInterval? {
        guard let duration = player?.currentItem?.duration else { return nil }
        return CMTimeGetSeconds(duration)
    }
 
    func getCurrentTime() -> TimeInterval {
        guard let currentTime = player?.currentTime() else { return 0 }
        return CMTimeGetSeconds(currentTime)
    }
 
    func play() {
        player?.play()
    }
 
    func pause() {
        player?.pause()
    }
 
    func stop() {
        player?.pause()
        player?.seek(to: .zero)
    }
    
    func trimmingMusicStop() {
        stop()
    }
 
    func seekTo(time: TimeInterval) {
        player?.seek(to: CMTime(seconds: time, preferredTimescale: 1))
    }
    
    func forward() {
        let currentTime = getCurrentTime()
        seekTo(time: currentTime + 5)
    }
 
    func backward() {
        let currentTime = getCurrentTime()
        seekTo(time: max(0, currentTime - 5))
    }
    
    @objc private func audioPlayerDidFinishPlaying() {
        musicCompleteEvent?()
        NotificationCenter.default.removeObserver(self, name: .AVPlayerItemDidPlayToEndTime, object: player?.currentItem)
    }
}

这个版本用AVPlayer替代AVAudioPlayer,能更好地处理非标准音频格式。

4. 验证下载文件完整性

确保从Digital Ocean Spaces下载的本地文件没有损坏,对比本地文件和云端文件的MD5值:

  • 云端文件MD5:在Digital Ocean Spaces控制台查看文件的元数据
  • 本地文件MD5:用终端命令md5 filePath获取
    如果MD5不一致,说明下载过程中文件损坏,需要检查你的NetworkManager下载逻辑是否有问题。

内容的提问来源于stack exchange,提问作者kshitij vyas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 09:05:12