2014-11-04 24 views
1

我正在開發一個Android應用程序。在這個應用程序中,2個用戶互相交談。在第一位用戶的身邊,應用程序使用AudioRecord進行錄製並將錄製的文件發送到服務器。另一方面,應用程序將下載這些文件並使用AudioTrack播放它們。這個過程是連續的;這意味着我在用戶仍在說話時保持錄音和發送。一切工作正常,但我有一個上傳文件大小的問題。我沒有找到控制錄製文件大小的方法。如果我能找到一種方法來告訴audioRecord使用,例如:setAudioSamplingRate(low),set lowAudioEncodingBitRate(low),setOutputFormat(OutputFormat.THREE_GPP),setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB),則可以解決整個問題。以最小的文件尺寸連續錄製。 AudioRecord或MediaRecorder?

我知道我們可以將這些與MediaRecorder一起使用,但我必須使用AudioRecord,因爲我想在發送之前分析聲音。

在這裏,我們有兩兩件事: 我)或者使用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

如果我理解正確的話,你希望儘量減少數據流量。

我認爲其中一個問題是PCM基本上是未壓縮的音頻,這對於最小化使用的帶寬並不是很好。我想你想要做的是使用MediaCodec來創建一個編碼器,可能是像amr/nb。然後通過排隊輸入緩衝區將音頻幀送入編碼器,並通過使輸出緩衝區出列來上傳編碼數據。