WhatsApp不支持显示错误消息的音频文件

时间:2019-07-15 04:53:05

标签: android whatsapp

我已经使用AudioRecord类(创建原始文件)记录音频,并使用AudioTrack类来处理和播放它,并在更改其频率后将pcm(raw)文件更改为wav并保存了。

现在,我正在尝试使用共享意图在whatsapp上共享音频文件,但是whatsapp显示错误对话框“无法处理音频,请稍后再试”

//录制音频

private void startRecord(){

    File file = new File(Environment.getExternalStorageDirectory(), "8k16bitMono.pcm");

    int sampleFreq = 8000;

    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.VOICE_RECOGNITION,
                sampleFreq,
                AudioFormat.CHANNEL_CONFIGURATION_MONO,
                AudioFormat.ENCODING_PCM_16BIT,
                minBufferSize);

        NoiseSuppressor noiseSuppressor = null;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) {
            noiseSuppressor = NoiseSuppressor.create(audioRecord.getAudioSessionId());
            Log.d("Audio", "NoiseSuppressor.isAvailable() " + NoiseSuppressor.isAvailable());
        }

        if (noiseSuppressor != null) {
            noiseSuppressor.release();
        }

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

}

//要播放并更改其频率

private void playRecord(int sampleFreq, String filterName) {

    File file = new File(Environment.getExternalStorageDirectory(), "8k16bitMono.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();


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

        rawToWave(sampleFreq, filterName, "/sdcard/8k16bitMono.pcm");


    } catch (IOException e) {
        e.printStackTrace();
    }
}

//要将原始文件转换为WAV

private void rawToWave(int SAMPLE_RATE,String filterName,String path)引发IOException {

    File rawFile = new File(path);

    byte[] rawData = new byte[(int) rawFile.length()];
    DataInputStream input = null;
    try {
        input = new DataInputStream(new FileInputStream(rawFile));
        input.read(rawData);
    } finally {
        if (input != null) {
            input.close();
        }
    }
    DataOutputStream output = null;
    try {
        output = new DataOutputStream(new FileOutputStream(new File(Environment.getExternalStorageDirectory(), filterName + ".wav")));
        // WAVE header
        writeString(output, "RIFF"); // chunk id
        writeInt(output, 36 + rawData.length); // chunk size
        writeString(output, "WAVE"); // format
        writeString(output, "fmt "); // subchunk 1 id
        writeInt(output, 16); // subchunk 1 size
        writeShort(output, (short) 1); // audio format (1 = PCM)
        writeShort(output, (short) 1); // number of channels
        writeInt(output, SAMPLE_RATE); // sample rate
        writeInt(output, SAMPLE_RATE * 2); // byte rate
        writeShort(output, (short) 2); // block align
        writeShort(output, (short) 16); // bits per sample
        writeString(output, "data"); // subchunk 2 id
        writeInt(output, rawData.length); // subchunk 2 size
        // Audio data (conversion big endian -> little endian)
        short[] shorts = new short[rawData.length / 2];
        ByteBuffer.wrap(rawData).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get(shorts);
        ByteBuffer bytes = ByteBuffer.allocate(shorts.length * 2);
        for (short s : shorts) {
            bytes.putShort(s);
        }
        output.write(bytes.array());
    } finally {
        if (output != null) {
            output.close();

            tv_share.setVisibility(View.VISIBLE);
            String pathString = filterName + ".wav";
            tv_share.setText(pathString);
        }


    }


}

0 个答案:

没有答案