Android AudioRecord MP3 кодирование AudioFormat.CHANNEL_IN_STEREO
Я, кажется, застрял с этой проблемой,
Я пытаюсь заставить https://github.com/yhirano/SimpleLameLibForAndroid работать в режиме ChannelConfig AudioFormat.CHANNEL_IN_STEREO.
Ниже код работает отлично, если я вызываю его с channelConfig = AudioFormat.CHANNEL_IN_MONO, но не с STEREO.
Я играл с
short[] buffer = new short[mSampleRate * (16 / 8) * nChannels * 5]
byte[] mp3buffer = new byte[(int) (7200 + buffer.length * 2 * 1.25)];
бу не может заставить его работать. Я имею в виду, что это работает, но записанный звук очень-очень медленный. Послушайте этот пример https://dl.dropboxusercontent.com/u/1465252/1381762795295.mp3
Похоже, есть еще один похожий вопрос, связанный с замедленным воспроизведением звука в формате Lame: Android без решения.
Кто-нибудь может помочь?
Вот код:
new Mp3Audio(MediaRecorder.AudioSource.MIC, 44100, AudioFormat.CHANNEL_IN_STEREO, A udioFormat.ENCODING_PCM_16BIT, 128);
public Mp3Audio(int audioSource, int sampleRate, int channelConfig, int audioFormat, int bitRate) {
if (sampleRate <= 0) {
throw new InvalidParameterException(
"Invalid sample rate specified.");
}
mSampleRate = sampleRate;
mBitRate = bitRate;
if (channelConfig == AudioFormat.CHANNEL_IN_MONO) {
nChannels = 1;
} else {
nChannels = 2;
}
builder = new Builder(mSampleRate, nChannels, mSampleRate, mBitRate);
//builder = new Builder(44100, 1, 44100, 128);
builder.quality(6);
mEncoder = builder.create();
cAmplitude = 0;
payloadSize = 0;
aFormat = audioFormat;
aSource = audioSource;
mChannelConfig = channelConfig;
}
public void start() {
final int minBufferSize = AudioRecord.getMinBufferSize(mSampleRate, mChannelConfig, aFormat) * mBufferSizeFactor;
if (minBufferSize < 0) {
AppHelper.Log(tag, "MSG_ERROR_GET_MIN_BUFFERSIZE");
return;
}
AppHelper.Log(tag, "minBufferSize: " + AppHelper.humanReadableByteCount(minBufferSize, true));
aRecorder = new AudioRecord(
aSource,
mSampleRate,
mChannelConfig,
aFormat,
minBufferSize);
short[] buffer = new short[mSampleRate * (16 / 8) * nChannels * 5]; // SampleRate[Hz] * 16bit * Mono * 5sec
AppHelper.Log(tag, "buffer: " + AppHelper.humanReadableByteCount(buffer.length, true));
byte[] mp3buffer = new byte[(int) (7200 + buffer.length * 2 * 1.25)];
AppHelper.Log(tag, "mp3buffer: " + AppHelper.humanReadableByteCount(mp3buffer.length, true));
.............
1 ответ
Чтобы дать вам указатель, вам нужно вызвать lame_encode_buffer_interleaved(), если вы используете 2 канала (.stereo) для записи.
Мне понадобилось несколько дней, чтобы понять это, вот код, который вы можете использовать:
if (lame_get_num_channels(glf) == 2)
{
result = lame_encode_buffer_interleaved(glf, j_buffer_l, samples/2, j_mp3buf, mp3buf_size);
}
else
{
result = lame_encode_buffer(glf, j_buffer_l, j_buffer_r, samples, j_mp3buf, mp3buf_size);
}