我已成功录制iOS音频,但问题是我无法向服务器发送音频。我尝试过的代码如下所示。
let audioData : NSData = try Data(contentsOf: (audioRecorder?.url)!) as NSData
var finalurl = url+Access_Token!
let params = [
"name":"iosTest.mp3",
"file": audioData] as [String : Any]
let manager = Alamofire.SessionManager.default
manager.session.configuration.timeoutIntervalForRequest = 30000
manager.request(finalurl, method: .post, parameters: params).responseJSON {
response in
stopActivityIndicator()
if let result = response.result.value {
let JSON = result as! NSDictionary
print(JSON)
let ResponseSuccess = JSON.object(forKey: "response")!
displayAlertMessage(userMessage: ResponseSuccess as! String, myView: self)
}
}
} catch let error as NSError {
print("audioPlayer error: \(error.localizedDescription)")
displayAlertMessage(userMessage: "Something error Occured! Please try again" as! String, myView: self)
}
答案 0 :(得分:1)
你是否从他们在GitHub上的官方文档中尝试过这个? Uploading Multipart Form Data
Alamofire.upload(
multipartFormData: { multipartFormData in
multipartFormData.append(audioRecorder?.url, withName: "iosTest.mp3")
},
to: "https://yourLinkGoesHere",
encodingCompletion: { encodingResult in
switch encodingResult {
case .success(let upload, _, _):
upload.responseJSON { response in
debugPrint(response)
}
case .failure(let encodingError):
print(encodingError)
}
}
)
Alamofire.upload(audioRecorder?.url, to: "https://yourLinkGoesHere").responseJSON { response in
debugPrint(response)
}
答案 1 :(得分:0)
SWIFT 5,Alamofire 5。
包含请求的文件和completion @escaping
:
import Alamofire
import SwiftyJSON
func request(variable1: String?, variable2: String?, audioFilePath: URL, completion: @escaping (String) -> ()) {
let url = URL(string: "https://...")!
let headers: HTTPHeaders = [
"content-type": "multipart/form-data; boundary=---011000010111000001101001",
"accept": "application/json",
"authorization": "Bearer \(your_token_if_needed)"
]
var parameters: [String: Any] = [:]
if variable1 != nil { parameters["var1"] = variable1 }
if variable2 != nil { parameters["var2"] = variable2 }
// Let's check the data
print(parameters)
AF.upload(multipartFormData: { multipartFormData in
for (key,value) in parameters {
multipartFormData.append((value as! String).data(using: .utf8)!, withName: key)
}
multipartFormData.append(audioFilePath, withName: "audio.m4a")
}, to: url, headers: headers)
.responseJSON { response in
switch response.result {
case .success:
do{
let json = try JSON(data: response.data!)
print(json)
// Parse an Array
let statusJson = json["status"].string
if statusJson == "success" {
completion("success")
}
else
{ completion(jsonErrorMsg!) }
} catch {
print(error.localizedDescription)
}
case .failure(let encodingError):
print("error:\(encodingError)")
}
}
}
您的 ViewController 类(您要在其中录制音频文件的地方)
// 1 - Delegation
class ViewController: UIViewController, AVAudioRecorderDelegate {
// 2 - Variables
var audioRecorder: AVAudioRecorder!
var audioFilename: URL!
var meterTimer:Timer!
var isAudioRecordingGranted: Bool!
override func viewDidLoad() {
super.viewDidLoad()
// MARK: - permission
switch AVAudioSession.sharedInstance().recordPermission {
case AVAudioSessionRecordPermission.granted:
isAudioRecordingGranted = true
audioRecorderAction()
break
case AVAudioSessionRecordPermission.denied:
isAudioRecordingGranted = false
break
case AVAudioSessionRecordPermission.undetermined:
AVAudioSession.sharedInstance().requestRecordPermission() { [unowned self] allowed in
DispatchQueue.main.async {
if allowed {
self.isAudioRecordingGranted = true
self.audioRecorderAction()
} else {
self.isAudioRecordingGranted = false
}
}
}
break
default:
break
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
audioRecorder = nil
}
func audioRecorderAction(){
if isAudioRecordingGranted {
//Create the session.
let session = AVAudioSession.sharedInstance()
do {
//Configure the session for recording and playback.
try session.setCategory(.playAndRecord, mode: .default, options: [])
try session.setActive(true)
//Set up a session
let settings = [
AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
AVSampleRateKey: 44100,
AVNumberOfChannelsKey: 2,
AVEncoderAudioQualityKey: AVAudioQuality.medium.rawValue
]
//file name URL
audioFilename = getDocumentsDirectory().appendingPathComponent("audio.m4a")
//Create the audio recording, and assign ourselves as the delegate
audioRecorder = try AVAudioRecorder(url: audioFilename, settings: settings)
audioRecorder.delegate = self
audioRecorder.isMeteringEnabled = true
audioRecorder.record()
meterTimer = Timer.scheduledTimer(timeInterval: 1.0, target:self, selector:#selector(self.updateAudioTimer(timer:)), userInfo: nil, repeats: true)
}
catch let error {
print("Error for audio record: \(error.localizedDescription)")
}
}
}
func finishAudioRecording(success: Bool) {
audioRecorder.stop()
audioRecorder = nil
meterTimer.invalidate()
if success {
print("Finished.")
} else {
print("Failed :(")
}
}
@objc func updateAudioTimer(timer: Timer) {
if audioRecorder.isRecording {
let min = Int(audioRecorder.currentTime / 60)
let sec = Int(audioRecorder.currentTime.truncatingRemainder(dividingBy: 60))
let totalTimeString = String(format: "%02d:%02d", min, sec)
recordingTimeLabel.text = totalTimeString
audioRecorder.updateMeters()
if (sec == 10) {
finishAudioRecording(success: true)
}
}
}
func getDocumentsDirectory() -> URL {
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
let documentsDirectory = paths[0]
return documentsDirectory
}
//MARK:- Audio recoder delegate methods
func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool) {
if !flag {
finishAudioRecording(success: false)
request(variable1: var_to_send1, variable2: var_to_send2, audioFilePath: audioFilename, completion: { (response) -> Void in
if response == "success" {
print("success")
} else {
print("error")
}
})
}
}