2017-02-10 3 views
1

私はスマートフォンマイクから何かを録音してファイルに保存してから、そのファイルを再生する簡単なアンドロイドアプリケーションを作っています。Android: - 録音したオーディオファイルをフロートアレイに変換する

ここで、ハイパスフィルタをそのオーディオファイルに適用したいのですが、そうするためには、最初にオーディオファイルをフロート配列に変換する必要があります。誰かがそれで私を助けてくれますか?

おかげ

package abc.com.please; 

import android.content.pm.PackageManager; 
import android.media.MediaPlayer; 
import android.media.MediaRecorder; 
import android.os.Bundle; 
import android.os.Environment; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.Button; 
import android.widget.Toast; 


public class MainActivity extends AppCompatActivity { 

private static MediaRecorder mediaRecorder = new MediaRecorder(); 
private static MediaPlayer mediaPlayer; 

private static String audioFilePath; 
private static Button stopButton; 
private static Button playButton; 
private static Button recordButton; 

private boolean isRecording = false; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    recordButton = (Button) findViewById(R.id.recordButton); 
    playButton = (Button) findViewById(R.id.playButton); 
    stopButton = (Button) findViewById(R.id.stopButton); 

    if (!hasMicrophone()) 
    { 
     stopButton.setEnabled(false); 
     playButton.setEnabled(false); 
     recordButton.setEnabled(false); 
    } else { 
     playButton.setEnabled(false); 
     stopButton.setEnabled(false); 
    } 

    audioFilePath = 
      Environment.getExternalStorageDirectory().getAbsolutePath() 
        + "/myaudio.3gp"; 


    recordButton.setOnClickListener(new View.OnClickListener(){ 

     public void onClick (View v) 
     { 

      isRecording = true; 
      stopButton.setEnabled(true); 
      playButton.setEnabled(false); 
      recordButton.setEnabled(false); 

      try { 
       mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
            mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
       mediaRecorder.setOutputFile(audioFilePath); 
        mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
       mediaRecorder.prepare(); 
       mediaRecorder.start(); 
      }catch (Exception e) { 
       e.printStackTrace(); 

      } 



     } 
    }); 

    stopButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick (View view) 
     { 

      stopButton.setEnabled(false); 
      playButton.setEnabled(true); 
      if (isRecording) 
      { 
       recordButton.setEnabled(false); 
       isRecording = false; 
       mediaRecorder.stop(); 
       mediaRecorder.release(); 
       recordButton.setEnabled(true); 
      } 
      else 
      { 
       Toast.makeText(getApplicationContext(),"No recording going  on",Toast.LENGTH_SHORT).show(); 
      } 
     }}); 

    playButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) 

     { 

      playButton.setEnabled(false); 
      recordButton.setEnabled(false); 
      stopButton.setEnabled(true); 
      try { 
       mediaPlayer = new MediaPlayer(); 
       mediaPlayer.setDataSource(audioFilePath); 
       mediaPlayer.prepare(); 
       mediaPlayer.start(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

     } 
    }); 
} 

protected boolean hasMicrophone() { 
    PackageManager pmanager = this.getPackageManager(); 
    return pmanager.hasSystemFeature(
      PackageManager.FEATURE_MICROPHONE); 
} 








} 
+0

チェックこの [スタックオーバーフローの質問] [1] [1]:http://stackoverflow.com/questions/6235016/convert-wav-audio-format-byte-array-to-浮動小数点 –

答えて

1

バイト・ツー・フロートの変換の詳細については、あなたのオーディオファイルに使用するファイル形式に依存しようとしています。私はあなたのコードからその形式が何であるかは分かりません。あなたのファイルがWAV、44100 fps、16ビット、リトルエンディアン、ステレオ(これは標準的なJavaの "CD品質"形式)の場合、私が書いた次のコードを使用してみることができます。それはビッグエンディアンである場合

float audioVal = (buffer[bufferIdx++] & 0xff) 
         | (buffer[bufferIdx++] << 8); 

、移行の順序を逆に2つのバイトを連結し(「緩衝液」は、オーディオファイルから読み取られるデータが含まれている単一の数字に変換されたときに鍵変換点であります24ビットまたは32ビットの場合は、< < 16と< < 24のシフトでそれぞれORします.16ビットの場合、結果はshortの範囲を使用するため、32767で除算する必要があります。結果は[-1..1]になります。

私はJavaのコンテキストで問題なく使用していますが、Androidがjavax.sound.sampled.AudをサポートしているかどうかはわかりませんioInputStreamなどがあります。ファイル読み込みのコンテキストで変換を確認するのはまだ有用でしょうか?このコードでは、「CD品質」のオーディオ形式を使用し、オーディオファイルがInteger.MAXフレーム数を超えていないと想定しています。

public float[] loadSoundFileURL(URL url) throws UnsupportedAudioFileException, 
     IOException 
{ 
    AudioInputStream ais = AudioSystem.getAudioInputStream(url); 

    int framesCount = (int)ais.getFrameLength(); 

    // assuming stereo format, so two entries per frame 
    float[] temp = new float[framesCount * 2]; 
    long tempCountdown = temp.length; 

    int bytesRead = 0; 
    int bufferIdx; 
    int clipIdx = 0; 
    byte[] buffer = new byte[1024]; 
    while((bytesRead = ais.read(buffer, 0, 1024)) != -1) 
    { 
     bufferIdx = 0; 
     for (int i = 0, n = (bytesRead >> 1); i < n; i ++) 
     { 
      if (tempCountdown-- >= 0) 
      { 
       temp[clipIdx++] = 
         (buffer[bufferIdx++] & 0xff) 
         | (buffer[bufferIdx++] << 8) ; 
      } 
     } 
    } 

    // QUESTION: better to do following in above loop? 
    for (int i = 0; i < temp.length; i++) 
    { 
     temp[i] = temp[i]/32767f; 
    } 

    return temp; 
} 
関連する問題