在android中录制时的声波

时间:2011-12-20 08:31:51

标签: android audio-recording

如何在android中录制声音时实现声波?

在下面的代码中

super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    resultView = (TextView) findViewById(R.id.output);

    try {
        // the soundfile
        File storageDir = new File(Environment
                .getExternalStorageDirectory(), "com.hascode.recorders");
        storageDir.mkdir();
        Log.d(APP_TAG, "Storage directory set to " + storageDir);
        outfile = File.createTempFile("hascode", ".3gp", storageDir);

        // init recorder
        recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        recorder.setOutputFile(outfile.getAbsolutePath());

        // init player
        player.setDataSource(outfile.getAbsolutePath());
    } catch (IOException e) {
        Log.w(APP_TAG, "File not accessible ", e);
    } catch (IllegalArgumentException e) {
        Log.w(APP_TAG, "Illegal argument ", e);
    } catch (IllegalStateException e) {
        Log.w(APP_TAG, "Illegal state, call reset/restore", e);
    }

    btRecord = (Button) findViewById(R.id.btRecord);
    btRecord.setOnClickListener(handleRecordClick);

    btPlay = (Button) findViewById(R.id.btPlay);
    btPlay.setOnClickListener(handlePlayClick);

}

private final OnClickListener handleRecordClick = new OnClickListener() {
    @Override
    public void onClick(View view) {
        if (!recording) {
            startRecord();
        } else {
            stopRecord();
        }
    }
};

private final OnClickListener handlePlayClick = new OnClickListener() {
    @Override
    public void onClick(View view) {
        if (!playing) {
            startPlay();
        } else {
            stopPlay();
        }
    }
};

private void startRecord() {
    Log.d(APP_TAG, "start recording..");
    printResult("start recording..");
    try {
        recorder.prepare();
        recorder.start();
        recording = true;
    } catch (IllegalStateException e) {
        Log
                .w(APP_TAG,
                        "Invalid recorder state .. reset/release should have been called");
    } catch (IOException e) {
        Log.w(APP_TAG, "Could not write to sd card");
    }
}

private void stopRecord() {
    Log.d(APP_TAG, "stop recording..");
    printResult("stop recording..");
    recorder.stop();
    recorder.reset();
    recorder.release();
    recording = false;
}

private void startPlay() {
    Log.d(APP_TAG, "starting playback..");
    printResult("start playing..");
    try {
        playing = true;
        player.prepare();
        player.start();
    } catch (IllegalStateException e) {
        Log.w(APP_TAG, "illegal state .. player should be reset");
    } catch (IOException e) {
        Log.w(APP_TAG, "Could not write to sd card");
    }
}

private void stopPlay() {
    Log.d(APP_TAG, "stopping playback..");
    printResult("stop playing..");
    player.stop();
    player.reset();
    player.release();
    playing = false;
}

private void printResult(String result) {
    resultView.setText(result);
}

1 个答案:

答案 0 :(得分:0)

您想将录制的声音与预先录制的海浪声合并吗?

如果是这样,也许您可​​以尝试创建不同来源的两个声音对象。然后你可能会间隔写入输出文件。预录制的一个间隔和新录制的一个间隔。

我实际上不知道这是否是一种有效的方法。正是我的一般方法将面临这个问题。