【问题标题】:To convert byte array to mp3 file将字节数组转换为 mp3 文件
【发布时间】:2014-04-14 16:33:25
【问题描述】:

我在 android 中编写了一个应用程序来记录麦克风的声音并使用

将其存储在字节数组中
audioRecord.read(bigBuff, currSize, minBuffSize);

bigBuff 是一个字节数组,现在我想将此字节数组转换为 .mp3 文件或 .wav 文件我正在这样做

File f = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/aaa.wav");

f.createNewFile();
FileOutputStream fos = new FileOutputStream(f);
fos.write(bigBuff);
fos.flush();
fos.close();

aaa.wav 文件已成功创建,但是当我尝试像任何其他 .wav 或 .mp3 文件一样从应用程序外部播放它时,它显示错误“抱歉播放器不支持这种类型的音频文件”

请帮忙。

【问题讨论】:

  • 什么是audioRecord.read?
  • audioRecord 是 AudioRecord 类的对象,read 是它的方法。

标签: android audio android-audiorecord


【解决方案1】:

我认为您没有输入数据标题。
添加此方法并在复制数据后。

        private void WriteWaveFileHeader(
                    FileOutputStream out, long totalAudioLen,
                    long totalDataLen, long longSampleRate, int channels,
                    long byteRate) throws IOException {

            byte[] header = new byte[44];

            header[0] = 'R';  // RIFF/WAVE header
            header[1] = 'I';
            header[2] = 'F';
            header[3] = 'F';
            header[4] = (byte) (totalDataLen & 0xff);
            header[5] = (byte) ((totalDataLen >> 8) & 0xff);
            header[6] = (byte) ((totalDataLen >> 16) & 0xff);
            header[7] = (byte) ((totalDataLen >> 24) & 0xff);
            header[8] = 'W';
            header[9] = 'A';
            header[10] = 'V';
            header[11] = 'E';
            header[12] = 'f';  // 'fmt ' chunk
            header[13] = 'm';
            header[14] = 't';
            header[15] = ' ';
            header[16] = 16;  // 4 bytes: size of 'fmt ' chunk
            header[17] = 0;
            header[18] = 0;
            header[19] = 0;
            header[20] = 1;  // format = 1
            header[21] = 0;
            header[22] = (byte) channels;
            header[23] = 0;
            header[24] = (byte) (longSampleRate & 0xff);
            header[25] = (byte) ((longSampleRate >> 8) & 0xff);
            header[26] = (byte) ((longSampleRate >> 16) & 0xff);
            header[27] = (byte) ((longSampleRate >> 24) & 0xff);
            header[28] = (byte) (byteRate & 0xff);
            header[29] = (byte) ((byteRate >> 8) & 0xff);
            header[30] = (byte) ((byteRate >> 16) & 0xff);
            header[31] = (byte) ((byteRate >> 24) & 0xff);
            header[32] = (byte) (2 * 16 / 8);  // block align
            header[33] = 0;
            header[34] = RECORDER_BPP;  // bits per sample
            header[35] = 0;
            header[36] = 'd';
            header[37] = 'a';
            header[38] = 't';
            header[39] = 'a';
            header[40] = (byte) (totalAudioLen & 0xff);
            header[41] = (byte) ((totalAudioLen >> 8) & 0xff);
            header[42] = (byte) ((totalAudioLen >> 16) & 0xff);
            header[43] = (byte) ((totalAudioLen >> 24) & 0xff);

            out.write(header, 0, 44);
    }

【讨论】:

  • @VarunKarhadkar 你想发表什么评论?
  • 需要更多帮助,我应该将什么传递给方法来代替 totalAudioLen 和 byteRate.. 我正在传递 fileoutputstream=fos totalDataLen=bigBuff.length(), int channels = AudioFormat.CHANNEL_IN_MONO longSampleRate = 44100
  • 哦,对不起。首先,将 .raw 文件保存在数据中。之后,试试这个。 FileInputStream in = new FileInputStream(.raw 文件)。 totalAudioLen 在.getChannel().size()
  • byteRate 是(每个采样值的比特 * 44100(采样率)* 1(如果你选择单声道)/8)
  • Amadas 我很抱歉,但我没有听懂你在说什么......我应该先将我的 bigBuff 数据保存在 .raw 文件中,然后使用 FileinputStream 读取它,然后再次保存这个文件,包括前面的标题.wav 文件。
【解决方案2】:

要配置标头,请参考以下链接

https://ccrma.stanford.edu/courses/422/projects/WaveFormat/

http://www.topherlee.com/software/pcm-tut-wavformat.html

上面的标题对我不起作用,但在对配置进行细微更改后,它可以正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 2015-09-16
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    相关资源
    最近更新 更多