【发布时间】:2014-11-04 12:03:08
【问题描述】:
我正在开发一个 Android 应用程序。在这个应用程序中,2 个用户互相交谈。在第一个用户侧,应用程序使用 AudioRecord 录制并将录制的文件发送到服务器。另一方面,应用程序将下载这些文件并使用 AudioTrack 播放它们。这个过程是连续的;这意味着我在用户仍在讲话时继续录制和发送。一切正常,但我对要上传的文件大小有疑问。我没有找到控制录制文件大小的方法。如果我能找到一种方法来告诉 audioRecord 使用例如:setAudioSamplingRate(low)、set lowAudioEncodingBitRate(low)、setOutputFormat(OutputFormat.THREE_GPP)、setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB),整个问题就可以解决。
我知道我们可以将这些与 MediaRecorder 一起使用,但我必须使用 AudioRecord,因为我想在发送之前分析声音。
在这里,我们有两件事: i)要么使用 MediaRecorder 而不是 AudioRecord(但我们可以连续录制,这样就不会丢失声音吗?) ii) 或者我们想办法告诉 AudioRecord 使用低分辨率设置
我不关心声音的质量,我想要最便宜的文件大小。 在下面找到我的代码:
录音
int frequency = 11025;
int channelConfiguration = AudioFormat.CHANNEL_IN_MONO;
int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
int bufferSize = AudioRecord.getMinBufferSize(frequency, channelConfiguration, audioEncoding);
AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency, channelConfiguration, audioEncoding, bufferSize);
DataOutputStream dos = getDOS();
int bufferReadResult = audioRecord.read(buffer, 0, bufferSize);
for (int i = 0; i < bufferReadResult; i++) dos.writeShort(enc(buffer[i]));
//Upload file to the server
播放
//download from server, then ...
int intSize = android.media.AudioTrack.getMinBufferSize(11025, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT);
final AudioTrack aud = new AudioTrack(AudioManager.STREAM_VOICE_CALL, 11025, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, intSize, AudioTrack.MODE_STREAM);
short[] arr = SoundFile2Array(f1);
aud.write(arr, 0, (int)(arr.length));
【问题讨论】:
标签: android audio mediarecorder recording audiotrack