2017-06-26 19 views
2

私はSwiftプログラミングにはとても新しいので、私を許してください。 私がしようとしているのは、ボイスレコーディングをしようとしているところです。以下は、iPhoneのマイクからストリームを取得する方法です。私は、このメソッドを使用してデバイス内のWAVファイルにストリームを保存するのに成功しています。私は、ファイルがOKであることを確認しにデータを変換し、Swift 3オーディオストリームを取得する

osErr = ExtAudioFileWrite(destinationFile!, frameCount, inputDataList)

何私は、オーディオストリームをキャプチャしていることに失敗しています、base64でエンコードされたデータとしてWKWebviewにストリームを渡す記録した後、罰金を再生していますBlobはHTML5 AudioタグのソースとしてBlobを渡します。

オーディオ要素はエラーをスローし、ブロブは再生しません。私は私のコードのsendAudioBufferの部分に私が渡す必要がある正しいデータを取得しているかどうかは分かりません。

私は実際に情報に感謝しています。私は、この方法は、BLOBに データを変換...

https://gist.github.com/hotpaw2/ba815fc23b5d642705f2b1dedfaf0107

func processMicrophoneBuffer(inputDataList: UnsafeMutablePointer<AudioBufferList>, frameCount : UInt32) { 
    let inputDataPtr = UnsafeMutableAudioBufferListPointer(inputDataList) 
    let mBuffers : AudioBuffer = inputDataPtr[0] 
    let count = Int(frameCount) 

    let bufferPointer = UnsafeMutableRawPointer(mBuffers.mData) 
    if let bptr = bufferPointer { 
     let dataArray = bptr.assumingMemoryBound(to: Float.self) 
     var sum : Float = 0.0 
     var j = self.circInIdx 
     let m = self.circBuffSize 
     for i in 0..<(count/2) { 
      let x = Float(dataArray[i+i ]) // copy left channel sample 
      let y = Float(dataArray[i+i+1]) // copy right channel sample 
      self.circBuffer[j ] = x 
      self.circBuffer[j + 1] = y 
      j += 2 ; if j >= m { j = 0 }    // into circular buffer 
      sum += x * x + y * y 
     } 
     self.circInIdx = j    // circular index will always be less than size 
     if sum > 0.0 && count > 0 { 
      let tmp = 5.0 * (logf(sum/Float(count)) + 20.0) 
      let r : Float = 0.2 
      audioLevel = r * tmp + (1.0 - r) * audioLevel 
     } 
    } 

    //This will write to a file 
    osErr = ExtAudioFileWrite(destinationFile!, frameCount, inputDataList) 

    //This will get the audio stream and send to WKWebview to be converted to Blob 
    sendAudioBuffer(buffer: Data(bytes: bufferPointer!, count: count)) 
} 
+0

JavaScriptで 'blob'とは何ですか? – guest271314

+0

'Audio要素だけでError'がスローされます...あなたの質問にエラーテキストを追加してください。 –

答えて

0

ここから得た、その後

を使用してHTML5オーディオタグ におけるソースとしてブロブを渡す元のコード

URL.createObjectURL(new Blob([blob], { type:{"audio/wav"} })

あなたは上記の行に間違った構文を持っています。正しいものは次のとおりです。あなたのblob本当にbase64文字列の場合も

URL.createObjectURL(new Blob([blob], {type:"audio/wav"})) 

、あなたはcreateObjectURLを取り除くとdata-uri eとHTML5オーディオタグであなたの<source>src属性を設定することができます。 g:

document.querySelector('#my_audio source').src = 'data:audio/wav;base64,' + blob; 

希望します。

関連する問題