swift - 快速将Base64字符串转换为音频文件
问题描述
我从 XML 解析中收到了一个 base64 字符串(字符串太长),我想将其转换为音频文件,我确实将那个 base64 字符串转换为 NSData 并成功写入文档目录但是当我取回该音频文件时它没有播放。有人面临这个吗?
func getPackages() {
let semaphore = DispatchSemaphore (value: 0)
let parameters = "<soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">\n <soap12:Body>\n <GetPackage xmlns=\"http://tempuri.org/\">\n <data>\n <UID>123</UID>\n <Platform>iOS</Platform>\n <PackageCode>UA</PackageCode>\n </data>\n </GetPackage>\n </soap12:Body>\n</soap12:Envelope>"
let postData = parameters.data(using: .utf8)
var request = URLRequest(url: URL(string: "https://www.cool-english.info/Service.asmx?wsdl")!,timeoutInterval: Double.infinity)
request.addValue("application/soap+xml; charset=utf-8", forHTTPHeaderField: "Content-Type")
request.httpMethod = "POST"
request.httpBody = postData
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data else {
print(String(describing: error))
return
}
let parser = XMLParser(data: data)
parser.delegate = self
parser.parse()
semaphore.signal()
}
task.resume()
semaphore.wait()
}
//XML解析委托
func parser(_ parser: XMLParser, foundCharacters string: String) {
let data = string.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
if (!data.isEmpty) {
if currentParsingElement == "GetPackageResult" {
packageResult += data
self.saveBase64StringToAudio(packageResult)
}
}
}
//用于写入文档目录
func saveBase64StringToAudio(_ base64String: String) {
guard
var documentsURL = (FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)).last,
let convertedData = Data(base64Encoded: base64String)
else {
//handle error when getting documents URL
return
}
//name your file however you prefer0
documentsURL.appendPathComponent("audio.mp3")
do {
try convertedData.write(to: documentsURL)
do {
audioPlayer = try AVAudioPlayer(contentsOf: documentsURL)
guard let player = audioPlayer else { return }
player.play()
} catch let error {
print(error.localizedDescription)
}
} catch {
//handle write error here
}
print(documentsURL)
}
解决方案
推荐阅读
- html - 购物车图标未正确显示
- wpf - ReportViewer 自定义协议
- border - graphviz 填充两个边界(外围)之间的间隙
- c# - 在等待 Task.Run 进行计算绑定操作时,是否正在使用 IOCP?
- java - 将作业部署到 Flink 集群
- java - 将部分 JSON 返回到对象 Spring boot
- javascript - 使用两个不同的 js 都生成一个 openlayers 地图,每个都不会在同一个 div 中替换另一个
- c++ - 大内存块的快速内存分配
- npm - 如何在 package.json 属性中使用 package.json 脚本的参数
- microsoft-graph-api - 在 GraphAPI 中创建团队总是返回 null