首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法使用Alamofire通过服务器上传音频文件

无法使用Alamofire通过服务器上传音频文件
EN

Stack Overflow用户
提问于 2016-11-13 15:11:07
回答 2查看 4.3K关注 0票数 0
代码语言:javascript
运行
复制
class VoiceRecogViewController: UIViewController, AVAudioPlayerDelegate, AVAudioRecorderDelegate {


var audioPlayer: AVAudioPlayer?
var audioRecorder: AVAudioRecorder?
var error: NSError?
var soundFileURL: URL?
var soundFilePath: String = ""
var data : NSData?

@IBOutlet weak var startRocordButton: UIButton!
@IBOutlet weak var stopRecordButton: UIButton!
@IBOutlet weak var playRecordButton: UIButton!
@IBOutlet weak var continueButton: UIButton!

override func viewDidLoad() {

    super.viewDidLoad()
    playRecordButton.isEnabled = false
    stopRecordButton.isEnabled = false

    let dirPaths =
        NSSearchPathForDirectoriesInDomains(.documentDirectory,
                                            .userDomainMask, true)

    let docsDir = dirPaths[0]
    soundFilePath = (docsDir as NSString).appendingPathComponent("sound.wav")
    soundFileURL = URL(fileURLWithPath: soundFilePath)

    let recordSettings = [AVEncoderAudioQualityKey: AVAudioQuality.min.rawValue,
                          AVEncoderBitRateKey: 16,
                          AVNumberOfChannelsKey: 2,
                          AVSampleRateKey: 44100.0] as [String : Any]

    let audioSession = AVAudioSession.sharedInstance()
    try! audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord, with: [])
    try! audioSession.setActive(true)

    if let err = error {
        print("audioSession error: \(err.localizedDescription)")
    }

    do {
        audioRecorder = try AVAudioRecorder(url: soundFileURL!,
                                            settings: recordSettings as [String : AnyObject])
    } catch {
        audioRecorder = nil
    }

    audioRecorder?.prepareToRecord()

    // Do any additional setup after loading the view.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


@IBAction func startRecord(_ sender: AnyObject) {
    if audioRecorder?.isRecording == false {
        playRecordButton.isEnabled = false
        startRocordButton.isEnabled = false
        stopRecordButton.isEnabled = true
        audioRecorder?.record()
    }
}

@IBAction func stopRecord(_ sender: AnyObject) {
    stopRecordButton.isEnabled = false
    playRecordButton.isEnabled = true
    startRocordButton.isEnabled = true

    if audioRecorder?.isRecording == true {
        audioRecorder?.stop()
    } else {
        audioPlayer?.stop()
    }
}

@IBAction func playRecord(_ sender: AnyObject) {
    if audioRecorder?.isRecording == false {
        stopRecordButton.isEnabled = true
        startRocordButton.isEnabled = false
    }

    do {
        try audioPlayer = AVAudioPlayer(contentsOf: soundFileURL!)
        audioPlayer?.delegate = self
        audioPlayer?.prepareToPlay()
        audioPlayer?.play()
    } catch {
        print("audioPlayer error")
    }
}

@IBAction func continueRegist(_ sender: AnyObject) {

    let headers: HTTPHeaders = ["Authorization": "Token ___(**token**)_____",
                                "Accept": "application/json"]

    data = NSData (contentsOf: soundFileURL!)

    let parameters: Parameters = ["from_account_id": "3",
                                  "to_account_id": "4",
                                  "file": data!,
                                 ]

    let URL = "http://leaofımjpüsmfweüdıpckfw"

            Alamofire.request(URL, method: .put, parameters: parameters, headers: headers).responseJSON { response in
                if let data = response.result.value {
                    print(data)
                }
            }
}
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
    startRocordButton.isEnabled = true
    stopRecordButton.isEnabled = false
}

func audioPlayerDecodeErrorDidOccur(_ player: AVAudioPlayer, error: Error?) {
    print("Audio Play Decode Error")
}

func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool) {
}

func audioRecorderEncodeErrorDidOccur(_ recorder: AVAudioRecorder, error: Error?) {
    print("Audio Record Encode Error")
}

我在上面分享了我的代码。这里的重点是将音频录制为.wav,在app和continueRegist部分中播放,我想用alamofire调用put方法,并将音频上传到我们的amazons3server。录音和播放音频部分完全工作。问题在于continueRegist方法。在调用该方法之后,我得到了正确的响应,它看起来很成功。然后,我将从我们的s3服务器的url中检查它。音频似乎上传,但当我下载和播放,它是不工作的。我不知道问题出在哪里。

此外,当我试图通过选择文件和提供正确的表单数据信息从邮递员上传时,我可以监听上传到s3服务器的声音。这里可能出了什么问题?

下面你可以通过邮递员找到我的请求:

正文:

在截图时,我忘记了选择文件,但它只是一个.wav文件。

标头

请不要犹豫地问我那些你不满意的问题。

希望你能帮我。

谢谢!

EN

Stack Overflow用户

发布于 2018-04-24 05:42:49

以下是上载音频文件的代码:

代码语言:javascript
运行
复制
let uploadAudioURL = "http://<your post API url>"



    let header : [String:String] = [
        "Authorization" : "<your authorisation token>"
    ]

    let voiceData = try? Data(contentsOf: <url of audio file to upload>)


    let params : [String:String] = [
        "length" : "39000",
        "title" : "Trying to upload",
    ]

    Alamofire.upload(
        multipartFormData: { (multipartFormData) in
            multipartFormData.append(voiceData!, withName: "voice", fileName: "TempRecordedAudioFile", mimeType: "audio/m4a")
            for (key, value) in params {
                multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key)
            }
    },
        usingThreshold : SessionManager.multipartFormDataEncodingMemoryThreshold,
        to : uploadAudioURL,
        method: .post,
        headers: header){ (result) in

            switch result {
            case .success(let upload, _, _):

                upload.uploadProgress(closure: { (Progress) in
                    print("Upload Progress: \(Progress.fractionCompleted)")
                })

                upload.responseJSON { response in

                    if let JSON = response.result.value {
                        print("Response : ",JSON)

                    }
                }

            case .failure(let encodingError):
                print(encodingError)
            }

    }

希望它能有所帮助。

使用上述代码段时要注意的一些要点:

  1. 确保您提供上传URL
  2. 添加必要的授权头详细信息。
  3. 在Alamofire.upload语句中,确保将withName设置为upload参数名。我使用了voice,您可能有不同的参数名称。
  4. upload.uploadProgress()是可选的。如果你不需要可以删除它。
票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40575335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档