2

wav形式で録音するときに、AndroidでAudioRecordオブジェクトのサンプルあたりのビット数を16ビットから8ビット(または他のビットレート)に変更するにはどうすればよいですか?

これは機能しません (たとえば、ここで説明したように: Using AudioRecord with 8-bit encoding in android ):

private static int RECORDER_AUDIO_ENCODING = 
         AudioFormat.ENCODING_PCM_8BIT; -->ERROR: Invalid Audio Format.
bufferSize = AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE,RECORDER_CHANNELS,
         RECORDER_AUDIO_ENCODING);
recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,RECORDER_SAMPLERATE, 
         RECORDER_CHANNELS,RECORDER_AUDIO_ENCODING, bufferSize);

ヘッダー付き:

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 content...
        header[32] = (byte) (2 * 16 / 8);  // block align
        header[33] = 0;
        header[34] = (byte)RECORDER_BPP;  // bits per sample, set to 8
        ...header content...

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

2 に答える 2

2

AudioFormat.ENCODING_PCM_16BIT8 ビット エンコーディングは通常 Android デバイスでは機能しないため、 を使用して 16 ビット サンプルを記録する必要があります。

次に、ウェーブ サウンド ファイルに書き込む前に、16 ビット バッファをオンザフライで 8 ビットに変換します。しかし、8 ビットの wave ファイルは符号なし整数 (0 ~ 255) を使用し、サイレンスは 0 ではなく 128 であるため、私が提案した変換はそれを修正します。以下は、単なるコード スケルトンです。

// Your source above already defined a value for bufferSize and the recorder object
sampleBufferShorts = new short[bufferSize];
sampleBufferBytes = new short[bufferSize];
int numberOfShortsRead = recorder.read(samleBufferShorts, 0, bufferSize);
if (numberOfShortsRead != ERROR_INVALID_OPERATION && numberOfShortsRead != ERROR_BAD_VALUE) {
    for (int i = 0 ; i < numberOfShortsRead ; ++i)
        sampleBufferBytes[i] = (byte)((sampleBufferShorts[i]>>8)+128);
}

ディザリングを追加すると品質が向上する理由については、https://stackoverflow.com/a/18777515/1986583を参照してください。

于 2014-05-26T05:49:41.817 に答える
1

.wav ファイルを後処理する必要があります。

于 2014-05-19T16:35:31.810 に答える