Android - 如何只反转数组的音频部分?

时间:2015-06-08 05:02:47

标签: android audio reverse

在坚果壳中,我不知道声音在阵列中的确切位置。 反转整个数组会破坏标题,并且它不再可播放。

我正在使用以下参数录制声音

mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

下面的代码反转了数组,但显然是错误的,因为我不知道要跳过多少个字节的字节。任何人都可以通过改变下面的功能来帮助,只反转音频部分?

private static void reverseAudio(byte[] data) {
  for (int left = 0, right = data.length - 1; left < right; left++, right--) 
  {
     byte temp = data[left];
     data[left]  = data[right];
     data[right] = temp;
  }

谢谢!

@JiangYD我是Android的新手,所以你的答案看起来很有希望,但我真的不能理解它。我正在使用MediaRecorder来创建音频文件。

AudioRecord类在哪里适合图片?

 private void startRecording() {
        mRecorder = new MediaRecorder();
        mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        mRecorder.setOutputFile(mFileName);
        mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

        try {
            mRecorder.prepare();
        } catch (IOException e) {
            Log.e(LOG_TAG, "prepare() failed");
        }

        mRecorder.start();
    }

 private void stopRecording() {
        mRecorder.stop();
        mRecorder.release();
        mRecorder = null;
    }

 private void startPlaying() {
        mPlayer = new MediaPlayer();
        try {
            File f = new File(mFileName);
            byte[] byteArray = null;

            InputStream inputStream = new FileInputStream(f);
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            byte[] b = new byte[1024 * 8];
            int bytesRead = 0;

            while ((bytesRead = inputStream.read(b)) != -1) {
                bos.write(b, 0, bytesRead);
            }

            byteArray = bos.toByteArray();
            reverseAudio(byteArray);

            File tempMp3 = File.createTempFile("kurchina", "3gpp", getCacheDir());
            tempMp3.deleteOnExit();
            FileOutputStream fos = new FileOutputStream(tempMp3);
            fos.write(byteArray);
            fos.close();

            FileInputStream fis = new FileInputStream(tempMp3);

            mPlayer.setDataSource(fis.getFD());
            mPlayer.prepare();
            mPlayer.start();


        }
        catch (IOException e) {
            Log.e(LOG_TAG, "prepare() failed");
        }
    }

1 个答案:

答案 0 :(得分:1)

您需要PCM格式进行音频处理。

new AudioRecord(MediaRecorder.AudioSource.DEFAULT
    , SAMPLE_RATE
    , AudioFormat.CHANNEL_IN_STEREO
    , AudioFormat.ENCODING_PCM_16BIT
    , CONNECT_TIMEOUT * SAMPLE_RATE * 2 / 1000);

捕获的音频数据将在您需要时短[左],短[右]。 您可以添加第3个AMR编码器,在处理后将PCM编码为AMR。