2017-03-12 9 views
1

私はチャットルームアプリケーションを作成していますが、これまでメッセージ、画像、ビデオを送信できます。Swift 3オーディオを録音してFirebaseストレージにアップロードして再生する

私は非常によく似た方法でビデオを送信していますが、オーディオを送信するときは機能しません。

オーディオファイルとオーディオURLがFirebaseに正常にアップロードされますが、オーディオを再生しようとすると、次のエラーが表示されます。操作を完了できませんでした。 (OSStatusエラー2003334207)。

プロジェクトはかなり圧倒的に大きくなっています。私はAVAudioの使用経験はほとんどありませんので、あなたにも同様の問題があった場合は、修正方法を教えてください。ありがとう!!!

ここにaudioRecorderを設定するコードがあります。ここにurlを取得し、それを他のfuncに渡して、オーディオファイルをFirebaseストレージに保存します。

func startRecording() { 
    let settings = [ 
     AVFormatIDKey: Int(kAudioFormatMPEG4AAC), 
     AVSampleRateKey: 12000, 
     AVNumberOfChannelsKey: 1, 
     AVEncoderAudioQualityKey: AVAudioQuality.low.rawValue 
    ] 

    do { 
     let audioFileUrl = getAudiFileURL() 
     audioRecorder = try AVAudioRecorder(url: audioFileUrl, settings: settings) 
     audioRecorder.delegate = self 
     audioRecorder.record() 
     blackView.isHidden = false 
    } catch { 
     finishRecording(success: false) 
    } 
} 

ここでは、オーディオファイルをFirebaseストレージにアップロードしようとしていますが、正しいdownloadURLが表示されます。

func handleAudioSendWith(url: String) { 
    guard let fileUrl = URL(string: url) else { 
     return 
    } 
    let fileName = NSUUID().uuidString + ".m4a" 

    FIRStorage.storage().reference().child("message_voice").child(fileName).putFile(fileUrl, metadata: nil) { (metadata, error) in 
     if error != nil { 
      print(error ?? "error") 
     } 

     if let downloadUrl = metadata?.downloadURL()?.absoluteString { 
      print(downloadUrl) 
      let values: [String : Any] = ["audioUrl": downloadUrl] 
      self.sendMessageWith(properties: values) 
     } 
    } 
} 

上記のaudioRecorderのURLを設定する方法は次のとおりです。

func getDocumentsDirectory() -> URL { 
    let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) 
    let documentsDirectory = paths[0] 
    return documentsDirectory 
} 

func getAudiFileURL() -> URL { 
    return getDocumentsDirectory().appendingPathComponent(".m4a") 
} 

そして、私は、オーディオ再生する場所です:私は実際にはURLが罰金であることを意味しており、URLを使用してFirebaseから音声ファイルをダウンロードして、自分のコンピュータ上で再生することができ

func handleAudioPLay() { 
    if let audioUrl = message?.audioUrl, let url = URL(string: audioUrl) { 
     do { 
      try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord) 
      audioPlayer = try AVAudioPlayer(contentsOf: url) 
      audioPlayer?.delegate = self 
      audioPlayer?.prepareToPlay() 
      audioPlayer?.play() 
      print("Audio ready to play") 
     } catch let error { 
      print(error.localizedDescription) 
     } 
    } 
} 

を。

答えて

1

URLSessionを使用してサウンドファイルをダウンロードし、AVAudioPlayer(data:data !, fileTypeHint: "aac")を使用してこの問題を解決しました。

関連する問題