录制声音并在Android中播放调制声音?

时间:2012-02-29 07:49:08

标签: android audio service record

您好我正在做一个与声音调制相关的应用程序我需要知道如何录制声音并调制另一个声音中录制的声音。喜欢会说话的汤姆猫应用。我试过了一个来自Stack over flow From HERE

的解决方案

来自另一个博客Blog Address

但我没有得到任何想法。可以请任何人给我一些想法或解决方案吗?

1 个答案:

答案 0 :(得分:4)

最后我找到了解决方案,这可能对某人有所帮助

http://android-er.blogspot.in/2012/06/implement-voice-changer-by-changing.html

public class Sound_modActivity extends Activity {

 Integer[] freqset = {11025, 16000, 22050, 44100};
 private ArrayAdapter<Integer> adapter;

 Spinner spFrequency;
 Button startRec, stopRec, playBack;

 Boolean recording;

/** Called when the activity is first created. */

   public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    startRec = (Button)findViewById(R.id.startrec);
    stopRec = (Button)findViewById(R.id.stoprec);
    playBack = (Button)findViewById(R.id.playback);

    startRec.setOnClickListener(startRecOnClickListener);
    stopRec.setOnClickListener(stopRecOnClickListener);
    playBack.setOnClickListener(playBackOnClickListener);

    spFrequency = (Spinner)findViewById(R.id.frequency);
    adapter = new ArrayAdapter<Integer>(this, android.R.layout.simple_spinner_item, freqset);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spFrequency.setAdapter(adapter);

    }

   OnClickListener startRecOnClickListener
= new OnClickListener(){


  public void onClick(View arg0) {

  Thread recordThread = new Thread(new Runnable(){


public void run() {
 recording = true;
 startRecord();
  }

  });

   recordThread.start();

  }};

 OnClickListener stopRecOnClickListener
 = new OnClickListener(){


 public void onClick(View arg0) {
 recording = false;
 }};

 OnClickListener playBackOnClickListener
 = new OnClickListener(){


public void onClick(View v) {
playRecord();
}

};

 private void startRecord(){

 File file = new File(Environment.getExternalStorageDirectory(), "test.pcm"); 

 int sampleFreq = (Integer)spFrequency.getSelectedItem();

 try {
   file.createNewFile();

  OutputStream outputStream = new FileOutputStream(file);
 BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
  DataOutputStream dataOutputStream = new DataOutputStream(bufferedOutputStream);

  int minBufferSize = AudioRecord.getMinBufferSize(sampleFreq, 
 AudioFormat.CHANNEL_CONFIGURATION_MONO, 
 AudioFormat.ENCODING_PCM_16BIT);

  short[] audioData = new short[minBufferSize];

  AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
 sampleFreq,
 AudioFormat.CHANNEL_CONFIGURATION_MONO,
 AudioFormat.ENCODING_PCM_16BIT,
 minBufferSize);

  audioRecord.startRecording();

  while(recording){
  int numberOfShort = audioRecord.read(audioData, 0, minBufferSize);
  for(int i = 0; i < numberOfShort; i++){
 dataOutputStream.writeShort(audioData[i]);
   }
  }

  audioRecord.stop();
  dataOutputStream.close();

  } catch (IOException e) {
  e.printStackTrace();
   }

  }

 void playRecord(){

 File file = new File(Environment.getExternalStorageDirectory(), "test.pcm");

    int shortSizeInBytes = Short.SIZE/Byte.SIZE;

  int bufferSizeInBytes = (int)(file.length()/shortSizeInBytes);
  short[] audioData = new short[bufferSizeInBytes];

  try {
InputStream inputStream = new FileInputStream(file);
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
DataInputStream dataInputStream = new DataInputStream(bufferedInputStream);

int i = 0;
while(dataInputStream.available() > 0){
 audioData[i] = dataInputStream.readShort();
i++;
}

 dataInputStream.close();

 int sampleFreq = (Integer)spFrequency.getSelectedItem();

 AudioTrack audioTrack = new AudioTrack(
 AudioManager.STREAM_MUSIC,
 sampleFreq,
 AudioFormat.CHANNEL_CONFIGURATION_MONO,
 AudioFormat.ENCODING_PCM_16BIT,
 bufferSizeInBytes,
 AudioTrack.MODE_STREAM);

audioTrack.play();
audioTrack.write(audioData, 0, bufferSizeInBytes);


 } catch (FileNotFoundException e) {
 e.printStackTrace();
} catch (IOException e) {
 e.printStackTrace();
}
 }

}