来自:http://blog.csdn.net/qq_24551315/article/details/51134999

思路: 将G711转为PCM , 然后将PCM数据转为AAC,

G711转为PCM,可以使用上一篇中讲到的方式, 而PCM转AAC(ADTS),采用的是faac这个开源库

这里只讲怎么实现, 了解更详细的内容,则需要自己查找学习了.

直接上代码.

[html]  view plain copy
  1. JNIEXPORT jint JNICALL Java_com_ff_aacdemo_jni_G711Coder_g711ToAAC
  2. (JNIEnv *env, jobject obj){
  3. unsigned long sampleRate = 8000;//采样率
  4. unsigned int channels = 1;//通道数
  5. unsigned int pcmBitSize = 16;// 量化位数
  6. long inputSamples;
  7. long maxOutputBytes;
  8. faacEncHandle codeHandle = faacEncOpen(sampleRate, channels, &inputSamples, &maxOutputBytes);
  9. int maxInputBytes = inputSamples * pcmBitSize / 8;
  10. LOGD("inputSamples = %ld, maxOutputBytes = %ld, maxInputBytes = %d", inputSamples, maxOutputBytes, maxInputBytes);
  11. faacEncConfigurationPtr pConfigPtr = faacEncGetCurrentConfiguration(codeHandle);
  12. pConfigPtr->inputFormat = FAAC_INPUT_16BIT;//输入数据类型
  13. pConfigPtr->outputFormat = 1; //0-Raw ; 1-ADTS
  14. pConfigPtr->useTns= 0;//瞬时噪声定形(temporal noise shaping,TNS)滤波器
  15. pConfigPtr->useLfe= 0;//低频效果
  16. pConfigPtr->aacObjectType= LOW; //编码类型
  17. pConfigPtr->shortctl=SHORTCTL_NORMAL;
  18. pConfigPtr->quantqual=50; // 编码质量
  19. pConfigPtr->mpegVersion = MPEG2;
  20. faacEncSetConfiguration(codeHandle, pConfigPtr);
  21. int m_nMaxInputBytes = inputSamples * pcmBitSize / 8;
  22. char pbPCMBuffer[m_nMaxInputBytes]; // 读取PCM数据
  23. char pbAACBuffer[maxOutputBytes];
  24. LOGD("g711topcm m_nMaxInputBytes = %d", m_nMaxInputBytes);
  25. LOGD("g711topcm maxOutputBytes = %d", maxOutputBytes);
  26. FILE* fpIn = fopen("/storage/emulated/0/t/pcm_to_g711.g711","rb");
  27. FILE* fpOut = fopen("/storage/emulated/0/t/pcm_to_g711.aac", "wb");
  28. size_t g711_BufferSize = m_nMaxInputBytes / 2;
  29. LOGD("g711topcm g711_BufferSize = %d", g711_BufferSize);
  30. char g711_Buffer[g711_BufferSize];//G711->PCM后,体积会变为原来的两倍,而PCM一次编码需要的最小字节数为m_nMaxInputBytes(如果小于它,编码后的数据不正常)
  31. size_t len;
  32. LOGD("********************************");
  33. while((len = fread(g711_Buffer, 1, g711_BufferSize, fpIn)) > 0){
  34. LOGD("g711topcm length = %d", len);
  35. char pcmBuffer[len];
  36. int pcmbufsize = g711_decode(pcmBuffer, g711_Buffer, len); // g711 -> pcm  (g711 转为 pcm 后其体积会增加一倍)
  37. LOGD("g711topcm pcmbufsize = %d", pcmbufsize);
  38. // pcm -> aac
  39. int inputSamples = pcmbufsize / (pcmBitSize / 8);
  40. LOGD("g711topcm inputSamples = %d", inputSamples);
  41. int nRetVal = faacEncEncode(codeHandle, (int*) pcmBuffer, inputSamples, pbAACBuffer, maxOutputBytes);
  42. LOGD("g711topcm nRetVal = %d", nRetVal);
  43. fwrite(pbAACBuffer, 1, nRetVal, fpOut);
  44. LOGD("----------------------------------");
  45. }
  46. fclose(fpIn);
  47. fclose(fpOut);
  48. faacEncClose(codeHandle);
  49. return 0;
  50. }

如果对AAC 的编解码不知道怎么弄的话, 可以看下一篇, 使用 faac, faad  实现 AAC 与 PCM 的互转
参考文章

http://blog.csdn.net/jwzhangjie/article/details/8782656
http://www.myexception.cn/program/1833150.html
http://iask.sina.com.cn/b/10699938.html
http://www.zhihu.com/question/20035259?utm_campaign=rss&utm_medium=rss&utm_source=rss&utm_content=title

G711转AAC代码总结【转】相关推荐

  1. 常用音频编码格式简介(PCM、G726、ADPCM、LPCM、G711、AAC)

    目录 PCM.G726.ADPCM.LPCM.G711.AAC介绍 格式对比 音频帧长 音频播放过程 PCM PCM全称Pulse-Code Modulation,翻译一下是脉冲调制编码. 在音视频中 ...

  2. LPCM AAPCM G711 G726 AAC 音频采样、编码及帧大小计算

    LPCM LPCM: linear pulse code modulation     LPCM,即线性脉冲编码调制,是一种非压缩音频数字化技术,是一种未压缩的原音重现,在普通CD.DVD及其他各种要 ...

  3. ffmpeg之封装AAC

    AAC是mp4的音频格式,而安防摄像机基本上使用G711等编码,想要封装成mp4供web预览,就需要跨越g711转AAC的这个难关. ffmpeg作为音视频界的泰斗,可以帮助我们实现这一功能. 代码流 ...

  4. G711编解码(G711与PCM类型互转)

    总结网上的G711编解码, 将其一直到andorid系统上去, 通过jni的来进行G711和PCM 的互转,  由于对于这两种格式没有深入的了解,, 所以如果想深入的了解他们可以百度, 在这里只是实现 ...

  5. RTP协议封装H264/H265/AAC

    <RTSP实时音视频传输介绍> 目录 一.前言 二.RTP基本格式介绍 1.RTP 固定头 2.RTP 扩展头 3.RTP 载荷 三.RTP封装H264 1.封装包类型 四.RTP封装H2 ...

  6. RTSP服务器:RTP传输AAC流

    工作流程: 1)读取ADTS头(7字节),解析得到aac帧的信息(频率,声道,帧长度) 2)读取aac原始数据块,使用RTP打包aac原始数据   RTP打包h264码流时,由于h264数据长度不稳定 ...

  7. libfdk_aac编码AAC

    目录 前言 1.AAC介绍 2.AAC 格式 一.libfdk_aac介绍 二.libfdk_aac主要API介绍 1.AACENC_ERROR aacEncOpen(HANDLE_AACENCODE ...

  8. 快速搭建基于GB/T28181-2016的完整音视频框架

    快速搭建基于GB/T28181-2016的完整音视频框架 建设目标 国家相关标准.行业标准 平台框架结构 平台开放 前端设备SDK 视频接入网关 PC客户端 移动客户端(Android) 标准过检 更 ...

  9. DAVINCI DM3730开发攻略——应用程序例程分析

    过完2015年春节回来了,利用上班前的几天时间,先把这篇文章写完,本来是先写<DAVINCI DM3730开发攻略--linux-2.6.32移植>,但是那篇文章涉及内核的东西太多,不太好 ...

最新文章

  1. MyEclipse安装Freemarker插件
  2. 3D点云two-stage目标检测方法优化综述
  3. python教程三角函数_Python入门之三角函数tan()函数实例详解
  4. MySQL 5.7 update误操作后数据恢复详解
  5. 【clickhouse】Clickhouse 支持毫秒 纳秒数据
  6. 手动处理MNIST手写数据集的逻辑斯蒂回归算法实践
  7. 得具备点靠钱赚钱的能力
  8. PyQt5-QLineEdit控件使用
  9. Surface平面计算机
  10. 上位机和下位机通信故障判断方法
  11. 关于Canvas 常用API汇总
  12. MD5 文件校验之 java 实现
  13. irr java_java-irr: java版的IRR和XIRR,通过牛顿算法实现内部收益率的计算
  14. 人性的弱点 ——戴尔卡耐基(笔记)
  15. 见丰知夏|国漫鼻祖丰子恺,数字藏品独家发售
  16. C++(常函数、常对象)
  17. ECCV22 | ByteTrack:简单、高效、实用的多目标跟踪方法
  18. 盘点一下代码中遇到的神注释
  19. Python -- 反编译pyc文件
  20. 同比增速创上市以来新低,云米科技何时能够走出小米的舒适圈?

热门文章

  1. 互联网电商大厂的分布式事务使用案例
  2. 归档(archive)文件(一)
  3. 7405 平台移植华为EC122上网卡
  4. 腾讯管家禁用好压右键进程,影响用户使用,的终极解决办法
  5. 央行发布第二批第三方支付牌照 13企业位列其中
  6. 个人用过的觉得很好的开发工具(不定时更新)
  7. PPLive for Ubuntu Linux
  8. [转载]ffmpeg的使用
  9. 魔兽争霸3(War3) YDWE下载与安装
  10. 24N50-ASEMI品质大功率场效应管