以最小文件大小连续录制。 AudioRecord 或 MediaRecorder?

Posted

技术标签:

【中文标题】以最小文件大小连续录制。 AudioRecord 或 MediaRecorder?【英文标题】:Continuous recording in smallest file size. AudioRecord or MediaRecorder? 【发布时间】: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));

【问题讨论】:

【参考方案1】:

如果我理解正确,您希望尽量减少数据流量。

我认为其中一个问题是 PCM 基本上是未压缩的音频,这对于最小化使用的带宽并不是很好。我认为你想要做的是使用 MediaCodec 创建一个编码器,也许是像 amr/nb 这样的东西。然后通过排队输入缓冲区将音频帧输入编码器,并通过出列输出缓冲区上传编码数据。

【讨论】:

以上是关于以最小文件大小连续录制。 AudioRecord 或 MediaRecorder?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AudioRecord 连续录制 4 秒组

使用 AudioRecord 录制音频

在 iPhone 上以最小的文件大小录制音频

使用 AudioRecord 以 .mp3 格式录制音频

无法在 Android 中播放使用 AudioRecord 录制的 pcm 文件

Android音频处理——通过AudioRecord去保存PCM文件进行录制,播放,停止,删除功能