如何在CloudKit中存储音频文件以及如何从中获取音频文件?

时间:2020-05-19 20:23:54

标签: swift audio cloudkit avaudiofile ckasset

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

var recordedMessage: AVAudioFile?

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

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

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

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

我认为这与无法正确将资产转换为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")
        }
    }

谁能告诉我我要去哪里错了?

1 个答案:

答案 0 :(得分:0)

花费了很多时间进行更改,但是我有一个有效的解决方案,该解决方案不涉及直接将数据作为Data进行操作。相反,我使用URL。我将audioAsset初始化为URL:

--drop table #hierarchy
CREATE TABLE #hierarchy
(
    ID INTEGER NOT NULL PRIMARY KEY,
    Value CHAR(10) NOT NULL,
);

INSERT INTO #hierarchy
VALUES (1, 'a1'), (2, 'b2'), (3, 'c3'), (4, 'd4'),
       (5, 'e5'), (6, 'f6'), (7, 'g7'), (8, 'h8');

我使用便利的初始化程序将ckRecord拉回了

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

然后我将其作为URL馈入了AVAudioPlayer:

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

(Sam,如果您正在阅读本文,感谢您朝着正确方向的轻轻推动!)

相关问题