增加录制audio的音量输出

我正在尝试在Android中创build通话录音应用程序。 我正在使用扬声器logging上行和下行audio。 我面临的唯一问题是音量太低。 我已经使用AudioManager增加了设备的音量到最大,它不能超越。

我第一次使用MediaRecorder,但由于它有限的function,并提供压缩audio,我已经尝试与AudioRecorder。 我还没有想出如何增加audio。 我也检查过Github上的项目,但是没用。 我已经search了最近两周的计算器,但找不到任何东西。

我很确定这是可能的,因为许多其他的应用程序正在这样做。 例如自动呼叫logging器这样做。

我明白,我必须做一些与audio缓冲区,但我不太确定需要做什么。 你能指导我吗?

更新: –
对不起,我忘记提及我已经在使用Gain。 我的代码几乎类似于RehearsalAssistant (实际上我从那里得到它)。 增益不能超过10dB,并且不会增加audio音量。 我想要的是我应该能够听到audio,而不用把耳朵放在我的代码中缺less的扬声器上。

在SoundDesign SE 这里,我已经提出了一个关于音量/响度function的类似问题。 它提到增益和响度是相关的,但它没有设置实际的响度水平。 我不知道事情是如何工作的,但是我决定得到大量的输出。

Solutions Collecting From Web of "增加录制audio的音量输出"

你显然有AudioRecord东西运行,所以我跳过了sampleRateinputSource的决定。 主要的一点是,您需要适当地操作logging环路中的每个logging数据样本以增加音量。 像这样:

  int minRecBufBytes = AudioRecord.getMinBufferSize( sampleRate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT ); // ... audioRecord = new AudioRecord( inputSource, sampleRate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, minRecBufBytes ); // Setup the recording buffer, size, and pointer (in this case quadruple buffering) int recBufferByteSize = minRecBufBytes*2; byte[] recBuffer = new byte[recBufferByteSize]; int frameByteSize = minRecBufBytes/2; int sampleBytes = frameByteSize; int recBufferBytePtr = 0; audioRecord.startRecording(); // Do the following in the loop you prefer, eg while ( continueRecording ) { int reallySampledBytes = audioRecord.read( recBuffer, recBufferBytePtr, sampleBytes ); int i = 0; while ( i < reallySampledBytes ) { float sample = (float)( recBuffer[recBufferBytePtr+i ] & 0xFF | recBuffer[recBufferBytePtr+i+1] << 8 ); // THIS is the point were the work is done: // Increase level by about 6dB: sample *= 2; // Or increase level by 20dB: // sample *= 10; // Or if you prefer any dB value, then calculate the gain factor outside the loop // float gainFactor = (float)Math.pow( 10., dB / 20. ); // dB to gain factor // sample *= gainFactor; // Avoid 16-bit-integer overflow when writing back the manipulated data: if ( sample >= 32767f ) { recBuffer[recBufferBytePtr+i ] = (byte)0xFF; recBuffer[recBufferBytePtr+i+1] = 0x7F; } else if ( sample <= -32768f ) { recBuffer[recBufferBytePtr+i ] = 0x00; recBuffer[recBufferBytePtr+i+1] = (byte)0x80; } else { int s = (int)( 0.5f + sample ); // Here, dithering would be more appropriate recBuffer[recBufferBytePtr+i ] = (byte)(s & 0xFF); recBuffer[recBufferBytePtr+i+1] = (byte)(s >> 8 & 0xFF); } i += 2; } // Do other stuff like saving the part of buffer to a file // if ( reallySampledBytes > 0 ) { ... save recBuffer+recBufferBytePtr, length: reallySampledBytes // Then move the recording pointer to the next position in the recording buffer recBufferBytePtr += reallySampledBytes; // Wrap around at the end of the recording buffer, eg like so: if ( recBufferBytePtr >= recBufferByteSize ) { recBufferBytePtr = 0; sampleBytes = frameByteSize; } else { sampleBytes = recBufferByteSize - recBufferBytePtr; if ( sampleBytes > frameByteSize ) sampleBytes = frameByteSize; } } 

感谢Hartmut和解决scheme的工作人员。 哈特穆特的代码在接近12-14分贝处工作。 为了增加音量,我也合并了声音库中的代码,但是增加了太多的噪音和失真,所以我把音量保持在1.5-2.0,而是试图增加增益。 我得到了不错的音量,这在电话里听起来不是很响,但是在电脑上听的时候听起来很响。 看起来这是我能走的最远的地方。

我发布我的最终代码来增加响度。 请注意,使用增加的mVolume会增加太多的噪音。 尝试增加收益。

 private AudioRecord.OnRecordPositionUpdateListener updateListener = new AudioRecord.OnRecordPositionUpdateListener() { @Override public void onPeriodicNotification(AudioRecord recorder) { aRecorder.read(bBuffer, bBuffer.capacity()); // Fill buffer if (getState() != State.RECORDING) return; try { if (bSamples == 16) { shBuffer.rewind(); int bLength = shBuffer.capacity(); // Faster than accessing buffer.capacity each time for (int i = 0; i < bLength; i++) { // 16bit sample size short curSample = (short) (shBuffer.get(i) * gain); if (curSample > cAmplitude) { // Check amplitude cAmplitude = curSample; } if(mVolume != 1.0f) { // Adjust output volume. int fixedPointVolume = (int)(mVolume*4096.0f); int value = (curSample*fixedPointVolume) >> 12; if(value > 32767) { value = 32767; } else if(value < -32767) { value = -32767; } curSample = (short)value; /*scaleSamples(outputBuffer, originalNumOutputSamples, numOutputSamples - originalNumOutputSamples, mVolume, nChannels);*/ } shBuffer.put(curSample); } } else { // 8bit sample size int bLength = bBuffer.capacity(); // Faster than accessing buffer.capacity each time bBuffer.rewind(); for (int i = 0; i < bLength; i++) { byte curSample = (byte) (bBuffer.get(i) * gain); if (curSample > cAmplitude) { // Check amplitude cAmplitude = curSample; } bBuffer.put(curSample); } } bBuffer.rewind(); fChannel.write(bBuffer); // Write buffer to file payloadSize += bBuffer.capacity(); } catch (IOException e) { e.printStackTrace(); Log.e(NoobAudioRecorder.class.getName(), "Error occured in updateListener, recording is aborted"); stop(); } } @Override public void onMarkerReached(AudioRecord recorder) { // NOT USED } }; 

在我的应用程序中,我使用了一个开源的声音库 。 它的主要目的是加快/减慢讲话速度,但除此之外,它也可以增加响度。 我将其应用于播放,但它必须同样适用于录制。 只需在压缩之前将样品通过它。 它也有一个Java接口。 希望这可以帮助。

简单使用MPEG_4格式

要增加通话logging音量使用AudioManager如下:

 int deviceCallVol; AudioManager audioManager; 

开始录制:

  audioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE); //get the current volume set deviceCallVol = audioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL); //set volume to maximum audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL, audioManager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL), 0); recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL); recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); recorder.setAudioEncodingBitRate(32); recorder.setAudioSamplingRate(44100); 

停止录制:

//将音量恢复到初始状态

  audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL, deviceCallVol, 0);