【问题标题】:Record Sound And play Modulated Sound In Android? [closed]在 Android 中录制声音并播放调制的声音? [关闭]
【发布时间】:2012-03-18 17:11:48
【问题描述】:

你好我目前正在做一个与声音调制相关的应用程序我需要知道如何录制声音并在另一个声音中调制录制的声音。像会说话的汤姆猫应用程序。我曾尝试从堆栈溢出的解决方案From HERE

来自另一个博客Blog Address

但我没有得到任何想法。谁能给我一些想法或解决方案?

【问题讨论】:

    标签: android audio service record


    【解决方案1】:

    我终于找到了可能对某人有所帮助的解决方案

    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();
    }
     }
    
    }
    

    【讨论】:

    • 您可能想在这里回答问题,而不仅仅是告诉我们您知道答案。
    • 虽然理论上可以回答这个问题,但我们希望您在回答中包含链接文章的基本部分,并提供link for reference。不这样做会使答案面临链接失效的风险。
    猜你喜欢
    • 2012-07-17
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多