gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 10:16:38 25 4
gpt4 key购买 nike

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,在应用程序中播放,在 continueRegist 部分我想用 alamofire 调用 put 方法并将音频上传到我们的 amazons3server。录制和播放音频部分完全正常。问题出在方法 continueRegist 中。调用该方法后,我得到了正确的响应,看起来很成功。然后,我从我们的 s3 服务器的 url 检查它。音频似乎已上传,但当我下载并播放时,它不起作用。我不知道问题出在哪里。

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

你可以在下面找到我通过 Postman 的请求:

正文: body

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

标题 headers

如果您不满意,请随时问我。

希望你能帮助我。

谢谢!

最佳答案

问题出在您的 Alamofire 请求中:您正在使用 JSON 中的音频数据构建 JSON。但是,您可以在 Postman 中检查请求是多部分表单数据的 HTTP 代码(右上/发送下方)。

如何实现多部分 Alamofire:它应该类似于我不确定 appendBodyPart 语句。他们取决于你的情况

let audioData: NSData = ...//should be loaded from the file

Alamofire.Manager.upload(.PUT,
URL,
headers: headers,
multipartFormData: { multipartFormData in
multipartFormData.appendBodyPart(data: "3".dataUsingEncoding(NSUTF8StringEncoding), name: "from_account_id")
multipartFormData.appendBodyPart(data: "4".dataUsingEncoding(NSUTF8StringEncoding), name: "to_account_id")
multipartFormData.appendBodyPart(data: audioData, name: "file", fileName: "file", mimeType: "application/octet-stream")
},
encodingCompletion: { encodingResult in
switch encodingResult {

case .Success(let upload, _, _):
upload.responseJSON { response in

}

case .Failure(let encodingError):
// Error while encoding request:
}
})

关于ios - 无法使用 Alamofire 通过服务器上传音频文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40575335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com