【问题标题】:Android - How to reverse only the audio part of an array?Android - 如何仅反转数组的音频部分?
【发布时间】:2015-08-22 11:15:04
【问题描述】:

简而言之,我不知道声音在数组中的确切位置。 反转整个数组会破坏标题,并且不再可播放。

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

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

【问题讨论】:

  • 你可以参考这篇文章,我认为这会对你有所帮助。 stackoverflow.com/questions/5625573/…
  • 声音不只是raw data。它有一个页眉,可能还有一个页脚。您必须研究您要使用的specific audio format
  • 您的音频是使用 AMR-NB 编解码器压缩的,因此即使您的标头正确,只是切换压缩的音频字节可能会给您留下垃圾。

标签: android audio reverse


【解决方案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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 2011-09-29
    • 2016-04-27
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    相关资源
    最近更新 更多