Lame 转码有2个方法
- lame_encode_buffer(lame,j_buff_left,j_buff_right,samples,j_mp3buff,mp3buf_size);
- lame_encode_buffer_interleaved(lame,j_pcm_buffer,samples,j_mp3buff,mp3buf_size);
但是lame_encode_buffer 在转码双声道时 会出现噪音
JNIEXPORT jint JNICALL Java_me_shetj_recorder_util_LameUtils_encode(
JNIEnv *env,
jclass cls,
jshortArray buffer_left,
jshortArray buffer_right,
jint samples,
jbyteArray mp3buf){
//把Java传过来参数转成C中的参数进行修改
jshort * j_buff_left =(*env)->GetShortArrayElements(env,buffer_left,NULL);
jshort * j_buff_right = (*env) ->GetShortArrayElements(env,buffer_right,NULL);
const jsize mp3buf_size = (*env) ->GetArrayLength(env,mp3buf);
jbyte* j_mp3buff = (*env) ->GetByteArrayElements(env,mp3buf,NULL);
int result = lame_encode_buffer(lame,j_buff_left,j_buff_right,samples,j_mp3buff,mp3buf_size);
//释放参数
(*env)->ReleaseShortArrayElements(env,buffer_left,j_buff_left,0);
(*env)->ReleaseShortArrayElements(env,buffer_right,j_buff_right,0);
(*env)->ReleaseByteArrayElements(env,mp3buf,j_mp3buff,0);
return result;
}
private fun processData(): Int {
if (mTasks.size > 0) {
val task = mTasks.removeAt(0)
val buffer = task.getData()
val encodedSize: Int
val readSize: Int
if (is2CHANNEL) {
//双声道
readSize = buffer.size / 2
val leftData = ShortArray(readSize)
val rightData = ShortArray(readSize)
for (i in 0 until readSize) {
if (i % 2 == 0) {
System.arraycopy(buffer, i * 2, leftData, i, 2)
} else {
System.arraycopy(buffer, i * 2, rightData, i - 1, 2)
}
}
encodedSize = LameUtils.encode(
leftData,
rightData,
readSize,
mMp3Buffer
)
} else {
readSize = buffer.size
encodedSize = LameUtils.encode(buffer, buffer, readSize, mMp3Buffer)
}
if (encodedSize > 0) {
try {
mFileOutputStream!!.write(mMp3Buffer, 0, encodedSize)
} catch (e: IOException) {
e.printStackTrace()
}
}
return readSize
}
return 0
}
最后使用lame_encode_buffer_interleaved 替代
JNIEXPORT jint JNICALL Java_me_shetj_recorder_util_LameUtils_encodeInterleaved(
JNIEnv *env,
jclass cls,
jshortArray pcm_buffer,
jint samples,
jbyteArray mp3buf){
//把Java传过来参数转成C中的参数进行修改
jshort * j_pcm_buffer =(*env)->GetShortArrayElements(env,pcm_buffer,NULL);
const jsize mp3buf_size = (*env) ->GetArrayLength(env,mp3buf);
jbyte* j_mp3buff = (*env) ->GetByteArrayElements(env,mp3buf,NULL);
int result = lame_encode_buffer_interleaved(lame,j_pcm_buffer,samples,j_mp3buff,mp3buf_size);
//释放参数
(*env)->ReleaseShortArrayElements(env,pcm_buffer,j_pcm_buffer,0);
(*env)->ReleaseByteArrayElements(env,mp3buf,j_mp3buff,0);
return result;
}
private fun processData(): Int {
if (mTasks.size > 0) {
val task = mTasks.removeAt(0)
val buffer = task.getData()
val encodedSize: Int
val readSize: Int
if (is2CHANNEL) {
//双声道
readSize = buffer.size / 2
encodedSize = LameUtils.encodeInterleaved(buffer,readSize,mMp3Buffer)
} else {
//单声道
readSize = buffer.size
encodedSize = LameUtils.encode(buffer, buffer, readSize, mMp3Buffer)
}
if (encodedSize > 0) {
try {
mFileOutputStream!!.write(mMp3Buffer, 0, encodedSize)
} catch (e: IOException) {
e.printStackTrace()
}
}
return readSize
}
return 0
}
网友评论