Ios 从文档目录检索音频文件
是否可以从文档目录中检索录制的音频文件?我浏览了整个互联网,但使用AVAsset/WKAudioFileAsset似乎不是正确的途径 是否有方法将录制的音频文件转换为NSData(二进制格式),将其发送到服务器,然后服务器将二进制数据转换回音频文件 我在这里发现: (本例是关于检索图像的,他们使用了UIImage) 所以,我很好奇是否有一种检索音频文件的等效方法?是否有音频类将文件保存到该类中,就像UIImage保存图像一样 我希望有人能帮助我。多谢各位 我的代码如下所示:Ios 从文档目录检索音频文件,ios,swift,audio,watchkit,Ios,Swift,Audio,Watchkit,是否可以从文档目录中检索录制的音频文件?我浏览了整个互联网,但使用AVAsset/WKAudioFileAsset似乎不是正确的途径 是否有方法将录制的音频文件转换为NSData(二进制格式),将其发送到服务器,然后服务器将二进制数据转换回音频文件 我在这里发现: (本例是关于检索图像的,他们使用了UIImage) 所以,我很好奇是否有一种检索音频文件的等效方法?是否有音频类将文件保存到该类中,就像UIImage保存图像一样 我希望有人能帮助我。多谢各位 我的代码如下所示: import Wat
import WatchKit
import Foundation
import AVFoundation
class InterfaceController: WKInterfaceController, AVAudioRecorderDelegate{
@IBOutlet weak var btn: WKInterfaceButton!
var recordingSession : AVAudioSession!
var audioRecorder : AVAudioRecorder!
var settings = [String : Any]()
override func awake(withContext context: Any?) {
super.awake(withContext: context)
recordingSession = AVAudioSession.sharedInstance()
do{
try recordingSession.setCategory(AVAudioSession.Category.playAndRecord)
try recordingSession.setActive(true)
recordingSession.requestRecordPermission(){[unowned self] allowed in
DispatchQueue.main.async {
if allowed{
print("Allow")
} else{
print("Don't Allow")
}
}
}
}
catch{
print("failed to record!")
}
// Configure interface objects here.
// Audio Settings
settings = [
AVFormatIDKey:Int(kAudioFormatLinearPCM),
AVSampleRateKey:44100.0,
AVNumberOfChannelsKey:1,
AVLinearPCMBitDepthKey:8,
AVLinearPCMIsFloatKey:false,
AVLinearPCMIsBigEndianKey:false,
AVEncoderAudioQualityKey:AVAudioQuality.max.rawValue
]
}
override func willActivate() {
// This method is called when watch view controller is about to be visible to user
super.willActivate()
print("Test")
}
override func didDeactivate() {
// This method is called when watch view controller is no longer visible
super.didDeactivate()
}
func directoryURL() -> URL? {
let fileManager = FileManager.default
let urls = fileManager.urls(for: .documentDirectory, in: .userDomainMask)
let documentDirectory = urls[0] as URL
let soundUrl = documentDirectory.appendingPathComponent("sound.wav")
// var soundUrlStr = soundUrl?.path
//print(fileManager.fileExists(atPath: soundUrlStr))
let filePath = (soundUrl).path
print(filePath)
print("URL")
print(soundUrl)
return soundUrl as URL?
}
func startRecording(){
let audioSession = AVAudioSession.sharedInstance()
do{
audioRecorder = try AVAudioRecorder(url: self.directoryURL()! as URL,
settings: settings)
audioRecorder.delegate = self
audioRecorder.prepareToRecord()
audioRecorder.record(forDuration: 5.0)
}
catch {
finishRecording(success: false)
}
do {
try audioSession.setActive(true)
audioRecorder.record()
} catch {
}
}
func finishRecording(success: Bool) {
audioRecorder.stop()
if success {
print(success)
} else {
audioRecorder = nil
print("Somthing Wrong.")
}
}
@IBAction func recordAudio() {
let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
let url = URL(fileURLWithPath: path)
let pathPart = url.appendingPathComponent("sound.wav")
let filePath = pathPart.path
let fileManager = FileManager.default
if fileManager.fileExists(atPath: filePath){
print("File exists!")
let audioAsset = WKAudioFileAsset(url:pathPart)
// let playerItem = WKAudioFilePlayerItem(asset:audioAsset)
print("Audio File")
print(audioAsset)
print("WAV file")
print(NSData(contentsOfFile: filePath) as Any)
}else{
print("File does not exist")
}
if audioRecorder == nil {
print("Pressed")
self.btn.setTitle("Stop")
self.btn.setBackgroundColor(UIColor(red: 119.0/255.0, green: 119.0/255.0, blue: 119.0/255.0, alpha: 1.0))
self.startRecording()
} else {
self.btn.setTitle("Record")
print("Pressed2")
self.btn.setBackgroundColor(UIColor(red: 221.0/255.0, green: 27.0/255.0, blue: 50.0/255.0, alpha: 1.0))
self.finishRecording(success: true)
}
}
func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool) {
if !flag {
finishRecording(success: false)
}
}
}
您不是从
recordAudio()
中的NSData(contentsOfFile:filePath)
获取了NSData吗?您可以使用此NSData将其发送到服务器。录制将保存到文件,因为它需要输出文件url。@NeverHopeless:这是唯一正确的方法吗??是的,我试过了。然后服务器会将二进制数据转换成音频文件(例如wav文件)?除了NSData之外,在检索音频的情况下,没有其他类似UIImage的方法了?NSData是字节的缓冲区,在iOS中,为了从一种形式转换为另一种形式,您需要首先将其转换为NSData。e、 例如,将用户对象保存到UserDefaults您必须首先将用户对象转换为NSData,然后将其保存到UserDefault,然后在检索时将NSData转换回用户对象。文件也是如此(.wav/txt到NSData,然后NSData到.txt/.wav)。至少在没有NSData的情况下,我没有看到任何方法可以做到这一点。从我的角度来看,是的,这是正确的方法。您不是从recordAudio()
中的NSData(contentsOfFile:filePath)
获取了NSData吗?您可以使用此NSData将其发送到服务器。录制将保存到文件,因为它需要输出文件url。@NeverHopeless:这是唯一正确的方法吗??是的,我试过了。然后服务器会将二进制数据转换成音频文件(例如wav文件)?除了NSData之外,在检索音频的情况下,没有其他类似UIImage的方法了?NSData是字节的缓冲区,在iOS中,为了从一种形式转换为另一种形式,您需要首先将其转换为NSData。e、 例如,将用户对象保存到UserDefaults您必须首先将用户对象转换为NSData,然后将其保存到UserDefault,然后在检索时将NSData转换回用户对象。文件也是如此(.wav/txt到NSData,然后NSData到.txt/.wav)。至少在没有NSData的情况下,我没有看到任何方法可以做到这一点。从我的角度看,这是正确的方法。