Lame 在使用lame_encode_buffer 在转码双声

2019-10-31  本文已影响0人  shetj

Lame 转码有2个方法

但是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
        }
上一篇 下一篇

猜你喜欢

热点阅读