我正在开发一个Android应用程序。在这个应用程序中,2个用户互相交谈。在第一个用户侧,应用程序使用AudioRecord记录并将记录的文件发送到服务器。另一方面,应用程序将下载这些文件并使用AudioTrack播放它们。这个过程是连续的;这意味着当用户还在说话时我会继续录音和发送。一切正常,但我要上传的文件大小有问题。我没有找到一种方法来控制录制文件的大小。如果我能找到告诉audioRecord使用的方法,可以解决整个问题:setAudioSamplingRate(低),设置lowAudioEncodingBitRate(低),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));
答案 0 :(得分:0)
如果我理解正确,您希望最大限度地减少数据流量。
我认为其中一个问题是PCM基本上是未压缩的音频,这对于最小化使用的带宽并不是很好。我认为你想要做的是使用MediaCodec来创建一个编码器,可能是像amr / nb这样的东西。然后通过排队输入缓冲区将音频帧送入编码器,并通过使输出缓冲区出列来上传编码数据。