2017-07-05 1 views
0

私は、Int16オブジェクトの配列であるswiftのDataオブジェクトを持っています。何らかの理由で、 ".pcmFormatInt16"を使用しても、私のAVAudioPCMBufferのフォーマットでは機能せず、サウンドもメモリエラーも発生しませんでした。最終的には、Int16をフロートに変換し、それをAVAudioPCMBufferの両方のチャンネルに入れることで、スピーカーからホワイトノイズ/スタティックを再生することができました。私は答えに近づいていると感じています。なぜなら、私がマイクに話すたびに、静的な周波数が違うからです。私は、変換されたInt16をバッファfloatChannelDataに変換していないという問題があると思います。ここでInt16をAVAudioPCMBufferに書き込むswift

は私のコードです:

for ch in 0..<2 { 
    for i in 0..<audio.count { 

     var val = Float(Int16(audio[i]))/Float(Int16.max) 

     if(val > 1){ 
      val = 1; 
     } 
     if(val < -1){ 
      val = -1; 
     } 


     self.buffer.floatChannelData![ch][i+self.bufferCount] = val 
     self.bufferCount+=1 
    } 
    } 
    self.audioFilePlayer.scheduleBuffer(self.buffer, at:nil, options: .interruptsAtLoop, completionHandler: { 
       print("played sum") 
       self.bufferCount=0 
    }) 
+0

に答える伝えたら

我々は継続することができ、私のコードの書式設定の一部はめちゃめちゃ少ないです。フレーズ "Here is my code:"の後に残りはコード –

答えて

0

一般的なマルチチャンネルPCMバッファサンプルごとにインタリーブチャンネルがあるが、迅速なオーディオに精通されていない、私はそれがさわやかここで指定したチャンネルを見るために見つけましたバッファーデータ構造上の次元

...あなたのガードチェックがval> 1などに設定されていると、フラグが立つ。...境界チェックが必要でないため、他の場所では必要ないデータは適切な場所にそのまま入ります

...私の推測はあなたの入力オーディオです[]はあなたのval> 1とval < -1のためint 16に署名されていますか?あなたは半分あなたのダイナミックレンジを失うことになると、その後、最大int型フロートで割る真が間違っている場合...

私はあなたがあなたの

var val = Float(Int16(audio[i]))/Float(Int16.max) 

をよく見てください、オーディオであなたのint型の範囲を調べることができます[] 0次に、署名された値の範囲であろう32768 //場合==

2^15〜65535である -

2^16 == 65536 //符号なしの場合、値は0から(1 2^16)までの範囲-32768から(2^15-1)までは-32768から32767までです。

入力バッファのオーディオ[]が署名されているかどうかを教えてください...入力データのmax_seenとmin_seenの値を特定するのに役立つことがあります...これを行い、入力の最大値と最小値を教えてくださいaudio []

ここでは、16ビットの浮動小数点数を指定しているので、希望する出力バッファself.buffer.floatChannelDataに注目してください。ここで有効な範囲は何ですか? -1 < valid_value < 1?あなたは、私たちは申し訳ありませんが、これらの基本的な質問

+0

です。この場合、私のパラメータはfalseに設定されているので、私のバッファはインターリーブされません。私はバッファが符号なしであると信じていますが、それはバイト単位ですが、私は完全にはわかりません。バッファが歌われているかどうかを確認する方法はありますか?また、はい、あなたは範囲について正しいです、迅速/客観的なcのドキュメントによると-1

+0

私はちょうどバッファから値をプリントアウトし、負の値がなかったので、バッファが署名されていると信じています。 –

+0

私はアンドロイドにアンドロイドが動作することを言及するべきです(私はフロートに変換しません)。バイトがアンドロイドにアンドロイドではなく、アンドロイドにはアンドロイドで動作する理由は何ですか? –

関連する問題