swift - 如何在 CloudKit 中存储和检索音频文件?

标签 swift audio cloudkit avaudiofile ckasset

我正在尝试录制语音消息并将其存储为 CloudKit 上的 CKAssets。我将它们转换为 AVAudioFile 并将它们保存到 CloudKit 作为 Post 记录上的多个属性之一。

var recordedMessage: AVAudioFile?

var recordedMessageURL: URL? {
    didSet {
        if let recordedMessageURL = recordedMessageURL {
            recordedMessage = try? AVAudioFile(forReading: recordedMessageURL)
        }
    }
}

这部分过程似乎有效,尽管当我通过 CloudKit 仪表板访问文件时无法播放音频。 (双击打开iTunes,但无法播放)

我创建了一个 fetchPosts 函数,它成功地获取了与记录相关的图像,但是当我尝试播放音频时,它给出了以下错误:

ExtAudioFile.cpp:192:Open: 即将抛出-43: 打开音频文件

我相信这与我无法将 Assets 正确转换为 AVAudioFile 有关。它似乎不像转换图像资源那么清晰。

    var foundAudio: AVAudioFile?
    if let audioAsset = ckRecord[PostStrings.audioAssetKey] as? CKAsset {
        do {
            let audioData = try Data(contentsOf: audioAsset.fileURL!)
            let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
            guard let destinationPath = NSURL(fileURLWithPath: documentsPath).appendingPathComponent("filename.m4a", isDirectory: false) else {return nil}

            FileManager.default.createFile(atPath: destinationPath.path, contents: audioData, attributes: nil)

            foundAudio = try AVAudioFile(forReading: destinationPath)
        } catch {
            print("Could not transform asset into data")
        }
    }

谁能告诉我哪里出错了?

最佳答案

花了很多天的时间来改变事情,但我已经有了一个可行的解决方案,不涉及直接将数据作为数据进行操作。相反,我使用 URL。我将 audioAsset 初始化为 URL:

var opComment: URL?
var audioAsset: CKAsset? {
  get {
    guard let audioURL = opComment else { return nil }
    return CKAsset(fileURL: audioURL)
    }
    set {
      opComment = newValue?.fileURL
    }
  }

我用一个方便的初始化程序将 ckRecord 拉回来:

var opCommentURL: URL?
    if let audioAsset = ckRecord[PostStrings.audioAssetKey] as? CKAsset {
            opCommentURL = audioAsset.fileURL
    }

我将它作为 URL 输入到我的 AVAudioPlayer 中:

        guard let audioURL = post.opComment else {return}

    if !isTimerRunning {
        do {
            audioPlayer = try AVAudioPlayer(contentsOf: audioURL)
            audioPlayer.play()
        } catch {
            print("Error in \(#function) : \(error.localizedDescription) /n---/n \(error)")
        }
    } else {
        audioPlayer.pause()
        isTimerRunning = false
    }

(如果您正在阅读本文,山姆。感谢您向正确的方向轻轻插入!)

关于swift - 如何在 CloudKit 中存储和检索音频文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61900119/

相关文章:

ios - 导航 Controller - 导航栏未显示在 child 身上

matlab - Matlab中的录音机

Java 如何等待剪辑结束

ios - 添加新条目后如何重新加载 TableView ?

ios - CloudKit:iCloud 架构计划部署(使用 Seam3)

ios - 日期选择器选择了错误的日期

ios - 手动设置 UITabBar selected Item 时遇到问题

异步下载图像时,SwiftUI 和 Combine 工作不流畅

iphone - HTML 音频播放导致 iPhone 闪烁

iphone - CKQueryOperation 获取最后一条记录