录制音频并将其发送到Swift 3中的服务器

时间:2017-10-18 07:49:40

标签: ios audio swift3

我已成功录制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)
}

2 个答案:

答案 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)
        }
    }
)

或此Uploading a File

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")
            }
        })
        }
    }