Android G711(PCMA/PCMU)、G726、PCM音频转码到AAC

首先先介绍下使用的开源库,当然还是要感谢开源库的作者们为我们提供了方便。

采用EasyAACEncoder 此是EasyDarwin开源流媒体服务团队整理、开发的一款音频转码到AAC的工具库,目前支持G711a/G711u/G726/PCM等音频格式的转码,跨平台,支持Windows/Linux/arm.

说明

EasyAACEncoder目前支持的音视频格式:

/* Audio Codec */
enum Law
{Law_ULaw    =   0,      /**< U law */Law_ALaw    =   1,      /**< A law */Law_PCM16   =   2,      /**< 16 bit uniform PCM values. 原始 pcm 数据 */  Law_G726    =   3       /**< G726 */
};/* Rate Bits */
enum Rate
{Rate16kBits=2,  /**< 16k bits per second (2 bits per ADPCM sample) */Rate24kBits=3,  /**< 24k bits per second (3 bits per ADPCM sample) */Rate32kBits=4,  /**< 32k bits per second (4 bits per ADPCM sample) */Rate40kBits=5   /**< 40k bits per second (5 bits per ADPCM sample) */
};

更多信息

详情请到:GitHub地址

回归正题

具体Android怎么使用该库呢,有以下步骤:

1.在上面地址下载开源库解压

2.把解压后的开源库放到项目jni文件夹里

3.去除无用东西,对有错误的进行剔除与修正

4.新建个调用c方法的类文件并写好调用方法

5.新建Android.mk文件与Application.mk文件完成相应配置

6.编辑打包so即可完成

熟练的大神们分分钟钟就搞定了,像我这样不熟悉的还是多多看看资料先写个小的demo练练手之后在来编译就简单多了。
在此过程中第三步与第四步麻烦是最多的。
现在简单说下
在第三步中要先去掉无用的文件,我直接把非.c源文件与.h头文件的直接剔除如下图我的:

该开源库也采用了libfacc如图:

之后如果仍然会有报错的文件,找到报错的所在地再解决,有的需要项目里关联C/C++ build才可以,有的还需要配置环境,具体网上教程有很多,就不在累赘,找到适合自己的就行。
还有就是c的方法与c++的方法有的地方不一样的需要格外注意下比如说env。
对四步主要看你的Java层怎么写方法调用了,然后编译自动生成即可,或者自己编写也行。
Java代码文件方法比如我的:

    public class JNIAACEncode {public static final int Law_ULaw = 0;/**< U law */public static final int Law_ALaw = 1;/**< A law */public static final int Law_PCM16 = 2;/**< 16 bit uniform PCM values. 原始 pcm 数据 */  public static final int Law_G726 = 3;/**< G726 *///首先进行实例化audioCodec为上面声明的音频类型public static native void init(int audioCodec);//原音频文件路径与转码后的音频文件路径public static native int encode(String infilename, String outAacname);static {System.loadLibrary("AACEncode");}}

对应的c代码为:

    JNIEXPORT void JNICALL Java_com_aacencoder_JNIAACEncode_init(JNIEnv *env,jobject obj, jint law) {InitParam initParam;initParam.u32AudioSamplerate = 8000;initParam.ucAudioChannel = 1;initParam.u32PCMBitSize = 16;if (Law_ALaw == law) {initParam.ucAudioCodec = Law_ALaw;} else if (Law_ULaw == law) {initParam.ucAudioCodec = Law_ULaw;} else if (Law_PCM16 == law) {initParam.ucAudioCodec = Law_PCM16;} else if (Law_G726 == law) {initParam.ucAudioCodec = Law_G726;initParam.g726param.ucRateBits = Rate40kBits;} else {LOGE("Java_com_aacencoder_JNIAACEncode_g711Ainit law failure =%d", law);return;}handle = Easy_AACEncoder_Init(initParam);LOGE("Java_com_aacencoder_JNIAACEncode_g711Ainit env=%p", env);}

转码方法为:

    JNIEXPORT jint JNICALL Java_com_aacencoder_JNIAACEncode_encode(JNIEnv *env,jobject obj, jstring jinfilename, jstring joutAacname) {char *infilename = jstringTostr(env, jinfilename); //类型进行转换char *outAacname = jstringTostr(env, joutAacname); //类型进行转换LOGE("inFilename = %s", infilename);LOGE("outAacname = %s", outAacname);//1.打开 wav,MP3文件//  FILE* fwav = fopen(cwav, "rb");//  FILE* fmp3 = fopen(cmp3, "wb");//  char* infilename = "g711.g711a";  //标准//  char* outAacname = "g711.aac";FILE* fpIn = fopen(infilename, "rb");if (NULL == fpIn) {printf("%s:[%d] open %s file failed\n", __FUNCTION__, __LINE__,infilename);return -1;}FILE* fpOut = fopen(outAacname, "wb");if (NULL == fpOut) {printf("%s:[%d] open %s file failed\n", __FUNCTION__, __LINE__,outAacname);return -1;}int gBytesRead = 0;int bG711ABufferSize = 500;int bAACBufferSize = 4 * bG711ABufferSize;  //提供足够大的缓冲区unsigned char *pbG711ABuffer = (unsigned char *) malloc(bG711ABufferSize * sizeof(unsigned char));unsigned char *pbAACBuffer = (unsigned char*) malloc(bAACBufferSize * sizeof(unsigned char));unsigned int out_len = 0;while ((gBytesRead = fread(pbG711ABuffer, 1, bG711ABufferSize, fpIn)) > 0) {if (Easy_AACEncoder_Encode(handle, pbG711ABuffer, gBytesRead,pbAACBuffer, &out_len) > 0) {fwrite(pbAACBuffer, 1, out_len, fpOut);}}Easy_AACEncoder_Release(handle);free(pbG711ABuffer);free(pbAACBuffer);fclose(fpIn);fclose(fpOut);return 0;}

上面方法别忘了引入头文件:

    #include <jni.h>#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include "EasyAACEncoderAPI.h"#include "com_aacencoder_JNIAACEncode.h"#include <android/log.h>#define  LOG_TAG    "VIDEO_AAC"#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)#define  LOGW(...)  __android_log_print(ANDROID_LOG_WARN,LOG_TAG,__VA_ARGS__)#define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)

把这些搞定基本完成80%啦,又可以愉快玩耍了。
下面要进行第五步了那就是编写配置文件:
这配置文件很简单,大家应该都会就不多说了,只不过要提醒下LOCAL_SRC_FILES列出所有文件要注意c文件与cpp文件区别。
如下我的:

    LOCAL_PATH := $(call my-dir)#生成so动态库include $(CLEAR_VARS)LOCAL_MODULE    := AACEncodeLOCAL_SRC_FILES := \./libfaac/aacquant.c \./libfaac/backpred.c \./libfaac/bitstream.c \./libfaac/channels.c \./libfaac/fft.c \./libfaac/filtbank.c \./libfaac/frame.c \./libfaac/huffman.c\./libfaac/ltp.c \./libfaac/midside.c \./libfaac/psychkni.c \./libfaac/tns.c \./libfaac/util.c \./libfaac/kiss_fft/kiss_fft.c \./libfaac/kiss_fft/kiss_fftr.c \audio_buffer.cpp EasyAACEncoder.cpp EasyAACEncoderAPI.cpp g711.cpp G711AToPcm.cpp g726.cpp G726ToPcm.cpp IDecodeToPcm.cpp PcmToAac.cpp AACEncoder.cLOCAL_LDLIBS += -lloginclude $(BUILD_SHARED_LIBRARY)

然后编译运行即可生成so库啦啦啦~
在libs文件里就能找到的~
本人使用的还Eclipse工具编译,由于Android Studio支持不是很好也比较麻烦。
就简单的说这些吧,提醒下对于第三步与第四步问题估计比较多,有问题那就多多去谷歌,问题会解决的!
GitHub源代码
点击CSDN下载

Android G711(PCMA/PCMU)、G726、PCM音频转码到AAC相关推荐

  1. java调用g726_AACEncode: Android G711(PCMA/PCMU)、G726、PCM音频转码到AAC

    AACEncode Android G711(PCMA/PCMU).G726.PCM音频转码到AAC 首先先介绍下使用的开源库,当然还是要感谢开源库的作者们为我们提供了方便. 采用EasyAACEnc ...

  2. java调用g726_Android G711(PCMA/PCMU)、G726、PCM音頻轉碼到AAC

    Android G711(PCMA/PCMU).G726.PCM音頻轉碼到AAC 首先先介紹下使用的開源庫,當然還是要感謝開源庫的作者們為我們提供了方便. 采用EasyAACEncoder 此是Eas ...

  3. Android录音,PCM音频数据打包成AAC

    之前做TUTK音视频流的拉流APP时踩了很多坑,曾经因为编解码问题熬了好几次夜,网上的资料也很有限,自己一点点拼凑来的,在这里Mark一下曾经走过的路. android的音频采集,我用的是androi ...

  4. 【Android FFMPEG 开发】Android 中使用 FFMPEG 将 PCM 音频采样转为 MP3 格式

    文章目录 一.前置操作 ( 移植 FFMPEG ) 二.FFMPEG 将 PCM 采样转为 MP3 格式的命令 三.Android FFMPEG 混音源代码完整示例 四.博客源码 一.前置操作 ( 移 ...

  5. G711(PCM/PCMA/PCMU),G721,G723,G729等 音频编解码

    G711,G721,G723音频编解码,G729音频库,Android G711(PCMA/PCMU).G726.PCM音频转码到AAC,ffmpeg接收g723音频流,Android G726语音编 ...

  6. 【Android RTMP】安卓直播推流总结 ( 直播服务器搭建 | NV21 图像采集 | H.264 视频编码 | PCM 音频采集 | AAC 音频编码 | RTMP 包封装推流 )

    文章目录 一. 安卓直播推流专栏博客总结 二. 相关资源介绍 三. GitHub 源码地址 四. 整体 Android 直播推流数据到服务器并观看直播演示过程 Android 直播推流流程 : 手机采 ...

  7. 【Android RTMP】音频数据采集编码 ( FAAC 编码器编码 AAC 音频采样数据 | 封装 RTMP 音频数据头 | 设置 AAC 音频数据类型 | 封装 RTMP 数据包 )

    文章目录 安卓直播推流专栏博客总结 一. FAAC 编码器编码 AAC 音频采样数据 二. 封装 RTMP 音频数据头 三. 封装 RTMP 音频数据类型 四. 拷贝 AAC 音频数据到 RTMPPa ...

  8. 【Android RTMP】音频数据采集编码 ( FAAC 编码器编码 AAC 音频解码信息 | 封装 RTMP 音频数据头 | 设置 AAC 音频数据类型 | 封装 RTMP 数据包 )

    文章目录 安卓直播推流专栏博客总结 一. FAAC 编码器编码 AAC 音频解码信息 二. 封装 RTMP 音频数据头 三. 封装 RTMP 音频数据类型 四. 拷贝 AAC 音频数据到 RTMPPa ...

  9. 【Android RTMP】音频数据采集编码 ( AAC 音频格式解析 | FLV 音频数据标签解析 | AAC 音频数据标签头 | 音频解码配置信息 )

    文章目录 安卓直播推流专栏博客总结 一. AAC 音频格式解析 二. FLV 音频数据标签解析 1. 分析 FLV 格式中的 AAC 音频格式数据 2. AAC 音频特殊配置 3. AAC 音频数据标 ...

最新文章

  1. 在64-bit机器上运行32-big的应用程序,需要安装ia32-libs库
  2. 第十五届全国大学生智能车竞赛线上竞赛方案(草案)
  3. 反对网抄,没有规则可以创建目标install 靠谱解答
  4. 汇编语言随笔(3)-条件转移指令和标志寄存器
  5. python函数修饰器_Python函数装饰器指南
  6. mysql集群数据引擎_MySQL数据引擎
  7. 递归法实现库函数strlen
  8. 微软官方windows phone开发视频教程第二天视频(附下载地址)
  9. Jquery mobile问题总汇
  10. android 协程,Android 上的 Kotlin 协程
  11. Microsoft Azure 简介及信息汇总
  12. lt;九度 OJgt;题目1545:奇怪的连通图
  13. (转)献给迷茫中的量化工作者
  14. OAuth 2.0 开放授权的那些事儿
  15. HCU500主轴编码器检测工具
  16. CS144-Lab4
  17. 百年辉煌师心向党 · 德高道厚幸福敬中——2021年石家庄敬业中学教师节庆祝大会
  18. 如何查看计算机所连接的打印机
  19. 数字图像处理--冈萨雷斯第4版--第一章 绪论
  20. batch_prob_classify

热门文章

  1. Zblog教程-Zblog网站安装教程-Zblog网站搭建教程
  2. Windows Server 2012 R2 RTM版安装
  3. C#编码格式转换,Url,escape,unicode编码和解码
  4. 【Python】Python入门IDLE下载、安装、使用教程和技巧
  5. serverlet 原理_serverlet_servlet工作原理面试题_serverlet和jsp(3)
  6. CSI Tool的安装
  7. 从积性函数到莫比乌斯反演
  8. 微软Chromium Edge浏览器发布,附带Edge浏览器下载地址!
  9. 操作系统4---接口以及实现
  10. ElasticSearch查询实现全字段搜索