I am using SimpleLameLibForAndroid to convert a pcm file that created using AudioRecord class in android,to mp3. I read the pcm file and encoded it into mp3 and then I write it in the file. the result mp3 file but is not correct and it has a lot of noise on it and really hard to understand that it was recorded pcm file. these are recorded audio specifications(pcm file):
private static final int RECORDER_SAMPLERATE = 8000; private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_MONO; private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT; int BufferElements2Rec = 1024; // want to play 2048 (2K) since 2 bytes we use only 1024 int BytesPerElement = 2; // 2 bytes in 16bit format recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, RECORDER_SAMPLERATE, RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING, BufferElements2Rec * BytesPerElement); and this is my code that uses liblame for encode mp3 and write it to file:
//Encoder.Builder(int inSamplerate,int outChannel,int outSampleRate,int outBitrate) Encoder en = new Encoder.Builder(8000, 1,8000,128).quality(7).create(); private int PCM_BUF_SIZE = 8192; private int MP3_SIZE = 8192; private void readFile() { File pcm = new File("/sdcard/voice8K16bitmono.pcm"); File mp3 = new File("/sdcard/BOOOB.mp3"); pcm.setReadable(true); mp3.setWritable(true); try { InputStream is = new FileInputStream(pcm); BufferedInputStream bis = new BufferedInputStream(is); bis.skip(44);//skip pcm header OutputStream os = new FileOutputStream(mp3); FileOutputStream fos = new FileOutputStream(mp3); int n_bytes_read ; int n_bytes_write; int i; byte mp3_buffer[] = new byte[MP3_SIZE]; byte pcm_buffer1[] = new byte[PCM_BUF_SIZE * 2]; do { n_bytes_read = bis.read(pcm_buffer1 , 0 , PCM_BUF_SIZE); if (n_bytes_read == 0){ n_bytes_write = en.flush(mp3_buffer); } else{ n_bytes_write = en.encodeBufferInterleaved(byte2short(pcm_buffer1) ,n_bytes_read , mp3_buffer); } bof.write(mp3_buffer, 0, PCM_BUF_SIZE); } while (n_bytes_read > 0); bis.close(); fos.close(); is.close(); en.close(); }catch (IOException e) { e.printStackTrace(); } } private short[] byte2short(byte[] pcm_buffer1) { short[] shorts = new short[pcm_buffer1.length/2]; ByteBuffer.wrap(pcm_buffer1).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get(shorts); return shorts; } how can i fix this code, is the bufferSizes true? using BufferedInputStream is correct? and...