美文网首页
Lame 在使用lame_encode_buffer 在转码双声

Lame 在使用lame_encode_buffer 在转码双声

作者: shetj | 来源:发表于2019-10-31 22:07 被阅读0次

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
        }

相关文章

  • Lame 在使用lame_encode_buffer 在转码双声

    Lame 转码有2个方法 lame_encode_buffer(lame,j_buff_left,j_buff_r...

  • Lame To MP3

    Lame framework 逻辑过程 1、声明Lame全局变量2、初始化Lame并设置各种转码参数3、开始转码 ...

  • iOS-使用Lame转码:PCM->MP3

    本文是iOS 使用AUGraph录音同时播放(并转码成MP3)中关于使用Lame将PCM转码成MP3的详细说明。看...

  • Android Studio接入lame

    在项目中要实装lame的开源库实现录音转码mp3的功能。期间遇到诸多问题,度娘了N多博客,最终总结了接入了lame...

  • 音频库

    lame库转码 mobile-ffmpeg https://github.com/tanersener/mobil...

  • 音视频开发进阶-学习笔记2-LAME交叉编译

    LAME简介 LAME是目前非常优秀的一种MP3编码引擎,行业内,转码MP3格式的音频文件时,LAME库就是最常用...

  • JNI练习-内存溢出

    这部分内容主要是参考Android NDK开发(六)——使用开源LAME转码mp3.我们参照原文,可以很方便的实现...

  • FFmpeg转码(2)

    FFmpeg音频转码 FFmpeg输出MP3 查看参数,使用之前需要先下载安装libmp3lame MP3的转换 ...

  • iOS音视频开发 - LAME编译

    LAME MP3编码引擎,目前在业界,转码成MP3格式的音频文件时,最常用的编码器就是LAME库。当达到320Kb...

  • Linux交叉编译Android可用的LAME库

    目录 Lame简介 LAME是目前非常优秀的一种MP3编码引擎,在业界,转码成MP3格式的音频文件时,最常用的编码...

网友评论

      本文标题:Lame 在使用lame_encode_buffer 在转码双声

      本文链接:https://www.haomeiwen.com/subject/vqdxbctx.html