2016-11-13 4 views
0
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 part Я хочу вызвать метод put с alamofire и загрузить аудио на наш amazons3server. Запись и воспроизведение аудио-части полностью работают. Проблема заключается в методе continueRegist. После вызова метода я получаю правильный ответ, он выглядит успешным. Затем я проверяю его с URL-адреса нашего s3-сервера. Звук кажется загруженным, но когда я загружаю и воспроизвожу его, он не работает. Я не мог понять, где проблема.Не удается загрузить аудиофайл через сервер с помощью Alamofire

Кроме того, когда я пытаюсь загрузить из Postman с выбором файла и предоставления правильной информации о форме, я могу прослушать звук, который я загрузил на сервер s3. Что здесь может быть неправильным?

Ниже вы можете найти свой запрос через Почтальон:

тела: body

Я забыл выбрать файл, когда я беру скриншот, но это просто .wav файл.

Headers headers

Пожалуйста, не стесняйтесь задавать мне вопросы, те, не удовлетворяет вас.

Надеюсь, вы можете мне помочь.

Спасибо!

+0

Какая ошибка вы получаете? – ELKA

+0

Ошибка не указана. И сервер, и amazon s3 принимают мой запрос и помещают файл в s3. По некоторым причинам я не понимаю и верю в проблему где-то там, когда я вручную загружаю файл из ссылки s3, мой файл не может быть воспроизведен. Обратите внимание, что я могу воспроизводить аудиофайл с загрузкой, которую я отправляю через Postman. Может возникнуть проблема с конструированием тела. –

+0

Таким образом, проблема заключается в том, когда вы загружаете звук, не загружая его, так как вы можете воспроизводить звук через Postman – ELKA

ответ

2

Проблема в вашем запросе Alamofire: вы создаете JSON со звуковыми данными в JSON. Тем не менее, вы можете проверить в Postman HTTP-код (вверху справа/внизу отправки), что запрос представляет собой Multi Form Form Data.

Как реализовать многослойную 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: 
          } 
}) 
+0

Хорошо, я немного поиграю с вашим предложением и попытаюсь заставить его работать, а затем ответит. Очень ценится –

+0

Можете ли вы также добавить заголовок аутентификации в свой ответ в качестве примера? –

+0

Я не на своем ноутбуке. редактирование фактически удалило параметр заголовка. Должен быть метод, который принимает параметры типа запроса (.Post/.put ..) и заголовки – ELKA

Смежные вопросы